====== 预处理概览(Preprocessor) ======
=== 基本定义 ===
预处理指令以#开头,标准C允许#的前后可以有空白字符,但旧的编译器可能不允许这么做。
如果一行中只有#一个非空白字符,标准C当作空白行处理。
在标准C中,**预处理行在宏扩展(macro expansion)之前识别**。所以,如果宏的扩展结果是预处理指令,则这条指令将不会被预处理器发现。如:
#define GETIO #include
GETIO
int main(void)
{
printf("hello, world!\n");
}
这可不等于经典的“hello, world”程序。经过预处理后,“#include ”仍旧在C源程序中(就好像没经过预处理一样),传递给编译器,从而编译时出错!
在词法(Lexical)部分提到过:预处理指令可以用\续行,注释中间的行结束符也不会中断预处理指令。
宏在注释、字符常量、字符串常量和#include中的文件名里不会被识别。
=== 预处理命令列表 ===
|#define |定义宏 |
|#undef |取消宏定义 |
|#include |包含头文件 |
|#if |条件编译 |
|#ifdef |::: |
|#ifndef |::: |
|#elif |::: |
|#else |::: |
|#endif |::: |
|#line |显式设定宏%%__LINE__%%和%%__FILE__%% |
|defined |宏(参数)定义返回1,否则返回0 |
|#operator |参数字符串化 |
|##operator |符号合并 |
|#pragma |设定依赖于实现的编译指示 |
|#error |产生一个编译错误 |
{{tag>C语言}}