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'选项禁止。