命名空间
变体
操作

文件名和行信息

来自 cppreference.com

更改预处理器中的当前行号和文件名。

内容

[编辑] 语法

#line lineno (1)
#line lineno "filename" (2)

[编辑] 说明

1) 将当前预处理器行号更改为 lineno。从此处开始,宏 __LINE__ 的出现将展开为 lineno 加上自此之后遇到的实际源代码行数。
2) 还将当前预处理器文件名更改为 filename。从此处开始,宏 __FILE__ 的出现将生成 filename

只要它们扩展为一个有效的十进制整数,可选地紧跟一个有效的字符串,就可以将任何预处理标记(宏常量或表达式)用作 #line 的参数。

lineno 必须至少包含一个十进制数字(否则程序将形成错误),并且始终解释为十进制(即使它以 0 开头)。

如果 lineno0 或大于 32767(直到 C99)2147483647(自 C99 起),行为未定义。

[编辑] 注释

此指令由一些自动代码生成工具使用,这些工具从用另一种语言编写的文件中生成 C 源文件。在这种情况下,#line 指令可能会插入到生成的 C 文件中,引用原始(人类可编辑)源文件中的行号和文件名。

在指令 #line __LINE__ 之后,行号未指定(在这种情况下,__LINE__ 可以扩展为两个可能的值:到目前为止看到的换行符数量,或者到目前为止看到的换行符数量加上结束 #line 指令的换行符)。这是 DR 464 的结果,该结果具有追溯效力。

[编辑] 示例

#include <assert.h>
#define FNAME "test.c"
int main(void)
{
#line 777 FNAME
        assert(2+2 == 5);
}

可能的输出

test: test.c:777: int main(): Assertion `2+2 == 5' failed.

[编辑] 参考文献

  • C17 标准 (ISO/IEC 9899:2018)
  • 6.10.4 行控制 (p: 126)
  • J.1 未指定的行为
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.10.4 行控制 (p: 173)
  • C99 标准 (ISO/IEC 9899:1999)
  • 6.10.4 行控制 (p: 158)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 3.8.4 行控制

[编辑] 另请参见

C++ 文档 用于 文件名和行信息