Namespaces
Variants

Filename and line information

From cppreference.net

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

目录

语法

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

说明

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

任何预处理记号(宏常量或表达式)只要展开后形成有效的十进制整数(可选地后接有效字符串),都允许作为 #line 的参数。

lineno 必须是由至少一个十进制数字组成的序列(否则程序格式错误),且始终被解释为十进制数(即使以 0 开头)。

如果 lineno 0 或大于 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 行控制(页码:158)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 3.8.4 行控制

参见

C++ documentation for Filename and line information