LINUX编程下GCC的宏

有些时候我们再编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没发现其在哪里被定义过,这时,这些宏很可能是系统编译器自己定义的。

比如:在OneNet平台(http://open.iot.10086.cn/)提供的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)

是条件预编译,即如果定义了符号_LINUX或者WIN32,则编译下面的代码。 但是找遍所有源码,都没有发现符号_LINUX被定义,LINUX系统下编译器常用GCC,因此查看GCC编译器中是否定义了该符号:

gcc -posix -E -dM - </dev/null | grep '_LINUX'

得不到任何输出,说明在GCC编译器中也没有定义该符号。那么这个符号是在哪里定义的呢?查看其Makefile发现gcc的编译指令为:

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