有些时候我们再编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没发现其在哪里被定义过,这时,这些宏很可能是系统编译器自己定义的。
比如:在OneNet平台()提供的EDP协议C语言版的SDK中,common.h头文件中有这样的定义
-
#if defined(_LINUX) || defined (WIN32)
-
typedef unsigned char uint8;
-
typedef char int8;
-
typedef unsigned short uint16;
-
typedef short int16;
-
typedef unsigned int uint32;
-
typedef int int32;
- #endif
- #if defined(_LINUX) || defined (WIN32)
- gcc -posix -E -dM - </dev/null | grep '_LINUX
-
all: edp.exe
-
-
CC=gcc
-
CFLAGS=-I. -g -D_LINUX -lm -lpthread -pedantic
- CLIENT_OBJ = cJSON.o EdpKit.o Main.o
可以发现在使用GCC编译时使用了-D_LINUX选项,该选项的作用是在编译时增加对-D后面的宏定义。因此common.h文件中的_LINUX宏是在GCC编译时通过-D选项给出的。
此外,把该SDK移植到QT4.0中使用时,由于Qt4.0中使用的编译器没有定义符号_LINUX,导致开始编译不通过,在common.h中手动添加_LINUX的定义,编译通过。Qt4.0中使用的common.h内容如下:
-
#define _LINUX //自己手动定义的_LINUX符号
-
-
#if defined(_LINUX) || defined (WIN32)
-
typedef unsigned char uint8;
-
typedef char int8;
-
typedef unsigned short uint16;
-
typedef short int16;
-
typedef unsigned int uint32;
-
typedef int int32;
- #endif