Namespaces
Variants

Filename and line information

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

更改预处理程序中的源代码行号,并可选择更改当前文件名。

目录

语法

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

说明

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

2) 同时将当前预处理器文件名更改为 filename 。从此处开始的宏 __FILE__ 展开将生成 filename

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

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

如果 lineno 0 或大于 32767 (C++11 前) 2147483647 (C++11 起) ,则行为未定义。

注释

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

示例

#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 文档 for 文件名和行号信息