====== 预处理概览(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语言}}