【发布时间】:2013-05-07 07:22:29
【问题描述】:
复制步骤:
将以下行插入 C++ 源代码的任意行。
#1234
任何行,包括第一行、最后一行。甚至你可以像这样在函数头和函数体之间输入。
int foo()
#1234
{
return 0;
}
数字可以很长,我测试了170多个字符。 如果添加任何非数字字符,则会出现编译错误。
我的问题是:为什么 # 后跟一个数字不会破坏编译,而 # 后跟一个非数字字符会。
感谢大家的宝贵时间。
【问题讨论】:
复制步骤:
将以下行插入 C++ 源代码的任意行。
#1234
任何行,包括第一行、最后一行。甚至你可以像这样在函数头和函数体之间输入。
int foo()
#1234
{
return 0;
}
数字可以很长,我测试了170多个字符。 如果添加任何非数字字符,则会出现编译错误。
我的问题是:为什么 # 后跟一个数字不会破坏编译,而 # 后跟一个非数字字符会。
感谢大家的宝贵时间。
【问题讨论】:
这是一个行指令。大多数预处理器输出这些以告诉编译器它实际上在原始源文件中的哪些行。
由于预处理器可以向它提供给编译器的源代码添加许多(有时数百甚至数千行)行,因此编译器需要跟踪原始源文件的行号。这是通过诸如这样的特殊指令来完成的。
【讨论】:
#line 是用于线路但不是#numbers。这可能是实现定义的行为。
# <line number> "source file" 或类似的,没有任何特殊关键字。
当我使用 GCC 编译它时,我收到以下警告:
warning: style of line directive is a GCC extension [enabled by default]
换句话说,这不是标准 C++,而是特定的编译器扩展(在这种情况下是预处理器扩展,特别是 line 指令)。
因此,您应该参考编译器的文档来检查哪些是允许的,哪些是不允许的。例如,see this。
【讨论】: