#line 指令 (C/C++)

#line 指令指示预处理器将编译器的行号和文件名报告值设置为给定行号和文件名。

语法

#linedigit-sequence [“filename”]

注解

编译器使用行号和可选文件名来引用它在编译过程中找到的错误。 行号通常引用当前输入行,文件名引用当前输入文件。 各行在经过处理后,行号将递增。

digit-sequence 值可以是介于 0 到 2147483647 范围内(含边界值)的任何整数常量。 宏替换可用于预处理令牌,但计算结果必须具有正确的语法。 filename 可以是字符的任意组合,必须用双引号 (" ") 引起来。 如果省略 filename,则上一个文件名保持不变

可以通过编写 #line 指令来更改源行号和文件名。 #line 指令可在源文件中设置指令之后紧跟的行的值。 翻译器使用行号和文件名来确定预定义宏 __FILE____LINE__ 的值。 你可以使用这些宏将自我描述性错误消息插入程序文本。 有关这些预定义宏的详细信息,请参阅预定义宏

__FILE__ 宏展开为一个字符串,其内容为文件名,用双引号 (" ") 引起。

如果更改行号和文件名,编译器将忽略以前的值,并继续处理新值。 #line 指令通常由程序生成器使用。 它用于让错误消息引用原始源文件,而不是引用生成的程序。

示例

以下示例演示 #line 以及 __LINE____FILE__ 宏。

在第一个示例中,行号设置为 10,然后设置为 20,文件名将更改为 hello.cpp

// line_directive.cpp
// Compile by using: cl /W4 /EHsc line_directive.cpp
#include <stdio.h>

int main()
{
    printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 10
    printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 20 "hello.cpp"
    printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
    printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
}
This code is on line 7, in file line_directive.cpp
This code is on line 10, in file line_directive.cpp
This code is on line 20, in file hello.cpp
This code is on line 21, in file hello.cpp

在此示例中,如果给定断言不为 true,则宏 ASSERT 使用预定义的宏 __LINE____FILE__ 打印有关源文件的错误消息。

#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}

另请参阅

预处理器指令