文件名和行信息

来自cppreference.com


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

语法

#line 行号 (1)
#line 行号 "文件名" (2)

解释

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

任何预处理记号(宏常量及表达式)都允许出现为 #line 的实参,只要它们展开成合法的十进制整数,可选地后随一个合法的字符串即可。

行号 必须是至少有一个十进制位的序列(否则程序非良构),并且始终按十进制判读(即使它以 0 开始)。

行号 为 0 或大于 32767 (C99 前)2147483647 (C99 起),则行为未定义。

注意

一些自动代码生成工具从以其他语言书写的文件产生 C 源文件,它们会使用此指令。该情况下,它们可能在生成的 C 文件中插入引用原始(人类可读)源文件的行号和文件名的 #line 指令。

#line __LINE__ 指令之后的行号是未指明的(该情况下 __LINE__ 可展开成两个可选值之一:迄今为止所见的换行符数,或迄今为止所见的换行符数加上结束 #line 指令的换行符)

示例

#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 Line control (第 126 页)
  • J.1 Unspecified behavior
  • C11 标准(ISO/IEC 9899:2011):
  • 6.10.4 Line control (第 173 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 6.10.4 Line control (第 158 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 3.8.4 Line control

参阅