命名空间
变体
操作

文件名和行号信息

来自 cppreference.cn
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句(循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++17* 中弃用)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

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

目录

[编辑] 语法

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

[编辑] 解释

1) 将当前的预处理器行号更改为 lineno。此后宏 __LINE__ 的展开将扩展为 lineno 加上自此以后遇到的实际源代码行数。

2) 还会将当前的预处理器文件名更改为 filename。此后宏 __FILE__ 的展开将产生 filename

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

lineno 必须是至少一位十进制数字的序列(否则程序是非良构的),并且始终被解释为十进制(即使它以 0 开头)。

如果 lineno0 或大于 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:2024)
  • 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]

[编辑] 参见

一个类,表示关于源代码的信息,例如文件名、行号和函数名
(类) [编辑]
C 文档 关于 文件名和行号信息