C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:
1.三字母词(Trigraph Sequences)
C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.
三字母词 | 单字符 |
??= | # |
??/ | \ |
??' | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
替换发生在任何其他处理之前。
例如:如果你尝试打印字符串"what??!"
如果你这样注释代码,结果会让你意外:
注意:由于编译器对ANSI C的支持不一样,有些编译器会把三字母词当普通字符处理,你需要给编译选项加上“-trigraphs”
2.行拼接
以反斜杠"\"结尾的行会把该行和下一行拼接成一行(预处理器做的工作就是把该反斜杠'"\"和接着的换行字符'\n'删除)。['\'称为续行符]
例如你可以这样写
a)简单宏替换
简单宏替换使程序中能用一个标识符来表示一个单词串,指令形式为:
注意:字符串常数中出现的与宏名相同的字符串不在替换之列。例如:
预处理指令的形式为:
例如:
操作符#把其后的串变成双引号包围的串;
操作符##把两个标志符拼在一起,形成一个新的标识符
int ab=12;
printf(str(hello world!)); // 会被替换成 printf("hello world!");
printf("ab=%d\n", cat(a,b)); // 会被替换成 printf("ab=%d\n", ab); 输出 ab=12
</div>
♦宏替换时的顺序
(1)在""内的宏名或宏参数名不被替换
(2)宏替换顺序:一个带参数的宏内部调用另一个宏,参数也是一个宏,则先替换外层的宏,再替换外层宏的参数,最后替换内层宏。
知道这些规则对于出现上面的结果就不难理解了。
温馨提示:在写带参数的宏替换指令时,推荐的做法时将单词串中的每一个参数都用()括起来,整个表达式也要用()括起来;否则,替换结果可能不是你想要的,例如:
c)取消宏定义
4.文件包含
条件编译指令格式如下:
if-line 正文
[#elif 常量表达式 正文]
...
[#else 正文]
#endif
</div>
if-line为下面中的任意一种形式:
(1)#if