在扩展宏之前是否处理了预处理程序指令?
谢谢
答案 0 :(得分:3)
是和否。每个预处理器指令都会定义自己与宏替换的交互。一般规则是(C ++ 11 16/6):
除非另有说明,否则预处理指令中的预处理标记不受宏扩展的影响 说明。
另一个相关的一般规则是16/1:
预处理指令由一系列满足以下约束的预处理标记组成: 序列中的第一个标记是
#
预处理标记(在转换阶段4的开始处) 源文件中的第一个字符(可选地在不包含换行符的空格之后)或那个 跟随包含至少一个换行符的空格。序列中的最后一个标记是第一个换行符 跟随序列中第一个标记的字符。换行符结束预处理 即使它发生在一个函数式宏的调用之内,也会发生指令。
(翻译阶段4是预处理)。
个别指令的一些规则:
#if
和#elif
在其参数中展开宏,但defined
(16.1 / 4)的参数除外。
#include
在其参数中展开宏;它们最终必须扩展为由""
或<>
分隔的字符串。
#line
在其参数中展开宏;它们最终必须扩展为#line
(16.4 / 5)的非宏参数的有效语法