6.10.6 行控制
约束
#line指令中如果带有字符串字面量,那么它必须是字符字符串字面量。
语义
- 当前源代码行的行号,是在处理源文件直到当前记号为止时,于翻译阶段
1中读入或引入的换行字符数量再加一。 - 如果某个预处理记号跨越两个或更多物理行,那么与该记号关联的是哪些行号,未指定。
- 如果某条预处理指令跨越两个或更多物理行,那么与该指令关联的是哪些行号,未指定。
- 如果某个宏调用跨越多个物理行,那么与该调用关联的是哪些行号,未指定。
- 一个预处理记号的行号与其上下文无关,例如是否作为宏实参或是否出现在预处理指令中。
- 宏体中
__LINE__的行号,取宏调用处的行号。 - 形如
c
#line digit-sequence1
的预处理指令,会使实现仿佛接下来的源代码序列从一个具有该十进制行号的源代码行开始。这里忽略其中可选的数字分隔符。这个数字既不能是 0,也不能大于 2147483647。
- 形如
c
#line digit-sequence "s-char-sequenceopt"1
的预处理指令,除了同样设置假定行号之外,还会把源文件的假定名称改成该字符字符串字面量的内容。
- 还允许使用形如
c
#line pp-tokens1
但不匹配前两种形式的指令。此时 line 后面的预处理记号按普通文本处理;所有宏替换完成后,所得指令必须匹配前两种形式之一,然后再按相应方式处理。
推荐实践
- 与某个
pp-token关联的行号,宜取该pp-token第一个字符所在的行号。 - 与某条预处理指令关联的行号,宜取该指令首个
#所在行的行号。 - 与某次宏调用关联的行号,宜取该调用中宏名第一个字符所在的行号。