跳到主要内容

文件名和行信息

在预处理器中更改源代码的行号,以及可选的当前文件名。

语法

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

解释

  1. 将当前的预处理器行号更改为 行号。从这一点开始的宏 __LINE__ 的展开将展开为 行号 加上遇到的实际源代码行数。
  2. 还会将当前预处理器文件名更改为 文件名。从此点开始的宏 __FILE__ 的展开将生成 文件名

允许使用任何预处理器标记(宏常量或表达式)作为参数给#line只要它们展开为有效的十进制整数,并且可以选择性地后跟一个有效的字符字符串。 行号必须是至少一位十进制数字的序列(否则程序格式错误),并且始终解释为十进制(即使它以 0 开头)。

如果 行号 为 0 或大于 32767 (C++11 之前) 2147483647 (C++11 起),行为是未定义的。

备注

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

示例

#include <cassert>
#define FNAME "test.cc"
int main()
{
#line 777 FNAME
assert(2+2 == 5);
}
可能结果
test: test.cc:777: int main(): Assertion `2+2 == 5' failed.

参考文献

  • C++23 标准 (ISO/IEC 14882:2023)
    • 15.7 行控制 [cpp.line]
  • C++20 标准 (ISO/IEC 14882:2020)
    • 15.7 行控制 [cpp.line]
  • C++17 标准 (ISO/IEC 14882:2017)
    • 19.4 行控制 [cpp.line]
  • C++14 标准 (ISO/IEC 14882:2014)
    • 16.4 行控制 [cpp.line]
  • C++11 标准 (ISO/IEC 14882:2011)
    • 16.4 行控制 [cpp.line]
  • C++98 标准 (ISO/IEC 14882:1998)
    • 16.4 行控制 [cpp.line]

文件名和行信息

在预处理器中更改源代码的行号,以及可选的当前文件名。

语法

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

解释

  1. 将当前的预处理器行号更改为 行号。从这一点开始的宏 __LINE__ 的展开将展开为 行号 加上遇到的实际源代码行数。
  2. 还会将当前预处理器文件名更改为 文件名。从此点开始的宏 __FILE__ 的展开将生成 文件名

允许使用任何预处理器标记(宏常量或表达式)作为参数给#line只要它们展开为有效的十进制整数,并且可以选择性地后跟一个有效的字符字符串。 行号必须是至少一位十进制数字的序列(否则程序格式错误),并且始终解释为十进制(即使它以 0 开头)。

如果 行号 为 0 或大于 32767 (C++11 之前) 2147483647 (C++11 起),行为是未定义的。

备注

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

示例

#include <cassert>
#define FNAME "test.cc"
int main()
{
#line 777 FNAME
assert(2+2 == 5);
}
可能结果
test: test.cc:777: int main(): Assertion `2+2 == 5' failed.

参考文献

  • C++23 标准 (ISO/IEC 14882:2023)
    • 15.7 行控制 [cpp.line]
  • C++20 标准 (ISO/IEC 14882:2020)
    • 15.7 行控制 [cpp.line]
  • C++17 标准 (ISO/IEC 14882:2017)
    • 19.4 行控制 [cpp.line]
  • C++14 标准 (ISO/IEC 14882:2014)
    • 16.4 行控制 [cpp.line]
  • C++11 标准 (ISO/IEC 14882:2011)
    • 16.4 行控制 [cpp.line]
  • C++98 标准 (ISO/IEC 14882:1998)
    • 16.4 行控制 [cpp.line]