响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:preprocessor

预处理概览(Preprocessor)

基本定义

预处理指令以#开头,标准C允许#的前后可以有空白字符,但旧的编译器可能不允许这么做。

如果一行中只有#一个非空白字符,标准C当作空白行处理。

在标准C中,预处理行在宏扩展(macro expansion)之前识别。所以,如果宏的扩展结果是预处理指令,则这条指令将不会被预处理器发现。如:

#define GETIO #include <stdio.h>
 
GETIO
 
int main(void)
{
        printf("hello, world!\n");
}

这可不等于经典的“hello, world”程序。经过预处理后,“#include <stdio.h>”仍旧在C源程序中(就好像没经过预处理一样),传递给编译器,从而编译时出错!

在词法(Lexical)部分提到过:预处理指令可以用\续行,注释中间的行结束符也不会中断预处理指令。

宏在注释、字符常量、字符串常量和#include中的文件名里不会被识别。

预处理命令列表

#define 定义宏
#undef 取消宏定义
#include 包含头文件
#if 条件编译
#ifdef
#ifndef
#elif
#else
#endif
#line 显式设定宏__LINE__和__FILE__
defined 宏(参数)定义返回1,否则返回0
#operator 参数字符串化
##operator 符号合并
#pragma 设定依赖于实现的编译指示
#error 产生一个编译错误
computer/c/tips/preprocessor.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1