是否在扩展宏之前处理预处理程序指令?

时间:2015-03-04 10:04:08

标签: c++ c-preprocessor preprocessor-directive

在扩展宏之前是否处理了预处理程序指令?

谢谢

1 个答案:

答案 0 :(得分:3)

是和否。每个预处理器指令都会定义自己与宏替换的交互。一般规则是(C ++ 11 16/6):

  

除非另有说明,否则预处理指令中的预处理标记不受宏扩展的影响   说明。

另一个相关的一般规则是16/1:

  

预处理指令由一系列满足以下约束的预处理标记组成:   序列中的第一个标记是#预处理标记(在转换阶段4的开始处)   源文件中的第一个字符(可选地在不包含换行符的空格之后)或那个   跟随包含至少一个换行符的空格。序列中的最后一个标记是第一个换行符   跟随序列中第一个标记的字符。换行符结束预处理   即使它发生在一个函数式宏的调用之内,也会发生指令。

(翻译阶段4是预处理)。

个别指令的一些规则:

  • #if#elif在其参数中展开宏,但defined(16.1 / 4)的参数除外。

  • #include在其参数中展开宏;它们最终必须扩展为由""<>分隔的字符串。

  • #line在其参数中展开宏;它们最终必须扩展为#line(16.4 / 5)的非宏参数的有效语法