4.1 宏的定义

下面的程序演示了C预处理器的常见用法。使用条件编译 #ifdef 检查宏是否定义。

当宏被定义了,预处理器会包含在 #endif 命令前面的相应代码。在这个例子中测试宏称为 TEST ,条件编译代码是 printf 函数打印的"Test mode"字符串:

include

int

main (void)

{

ifdef TEST

printf ("Test mode\n");

endif

printf ("Running...\n");

return 0;

}

gcc选项'-DNAME'为命令行定义了一个预处理器宏 NAME 。如果上面的程序使用'-DTEST'选项编译,TEST宏将会被定义,程序将会打印下面信息:

$ gcc -Wall -DTEST dtest.c

$ ./a.out

Test mode

Running...

如果这个程序没有使用'-D'选项则'Test mode'信息在预处理之后会被忽略,最后的可执行文件不在包含条件编译代码:

$ gcc -Wall dtest.c

$ ./a.out

Running...

通常宏是没有被定义的,除非在命令行中使用'-D'选项或者在源文件(或者库的头文件)中使用 #define 定义。有一些宏编译器会自动定义--他们使用特殊的保留命名空间以双下划线'__'为前缀。

可以使用'-dM'选项运行GNU预处理器cpp列出所有的预定义宏;

$ cpp -dM /dev/null

define i386 1

define __i386 1

define i386 1

define __unix 1

define unix 1

define ELF 1

define unix 1

.......

注意这些宏中包含一小部分系统特定的宏,他们没有使用双下划线前缀。这些非标准宏可以使用'-ansi'选项禁止。