16-从C预处理器角度看已定义
16.6.2 从C预处理器角度看已定义
预处理器在识别标识符时,遵循与C相同的规则:标识符可以由大写字母、小写字母、数字和下划线字符组成,且首字符不能是数字。当预处理器在预处理器指令中发现一个标识符时,它会把该标识符当作已定义的或未定义的。这里的已定义表示由预处理器定义。如果标识符是同一个文件中由前面的 #define
指令创建的宏名,而且没有用 #undef
指令关闭,那么该标识符是已定义的。如果标识符不是宏,假设是一个文件作用域的C变量,那么该标识符对预处理器而言就是未定义的。
已定义宏可以是对象宏,包括空宏或类函数宏:
#define LIMIT 1000 // LIMIT是已定义的
#define GOOD // GOOD 是已定义的
#define A(X) ((-(X))*(X)) // A 是已定义的
int q; // q 不是宏,因此是未定义的
#undef GOOD // GOOD 取消定义,是未定义的
注意, #define
宏的作用域从它在文件中的声明处开始,直到用 #undef
指令取消宏为止,或延伸至文件尾(以二者中先满足的条件作为宏作用域的结束)。另外还要注意,如果宏通过头文件引入,那么 #define
在文件中的位置取决于 #include
指令的位置。
稍后将介绍几个预定义宏,如 __DATE__
和 __FILE__
。这些宏一定是已定义的,而且不能取消定义。