为啥#后跟一个数字似乎在C plus plus中啥都不做

Posted

技术标签:

【中文标题】为啥#后跟一个数字似乎在C plus plus中啥都不做【英文标题】:why # followed by a number seems do nothing in C plus plus为什么#后跟一个数字似乎在C plus plus中什么都不做 【发布时间】:2013-05-07 07:22:29 【问题描述】:

复制步骤:

将以下行插入 C++ 源代码的任意行。

#1234

任何行,包括第一行、最后一行。甚至你可以像这样在函数头和函数体之间输入。

int foo()
#1234

return 0;

数字可以很长,我测试了170多个字符。 如果添加任何非数字字符,则会出现编译错误。

我的问题是:为什么 # 后跟一个数字不会破坏编译,而 # 后跟一个非数字字符会。

感谢大家的宝贵时间。

【问题讨论】:

【参考方案1】:

这是一个行指令。大多数预处理器输出这些以告诉编译器它实际上在原始源文件中的哪些行。

由于预处理器可以向它提供给编译器的源代码添加许多(有时数百甚至数千行)行,因此编译器需要跟踪原始源文件的行号。这是通过诸如这样的特殊指令来完成的。

【讨论】:

来源?我知道#line 是用于线路但不是#numbers。这可能是实现定义的行为。 @Rapptz 最常见的似乎只是# <line number> "source file" 或类似的,没有任何特殊关键字。 据我所知,它的标准版本是#line。【参考方案2】:

当我使用 GCC 编译它时,我收到以下警告:

warning: style of line directive is a GCC extension [enabled by default]

换句话说,这不是标准 C++,而是特定的编译器扩展(在这种情况下是预处理器扩展,特别是 line 指令)。

因此,您应该参考编译器的文档来检查哪些是允许的,哪些是不允许的。例如,see this。

【讨论】:

感谢您的快速回复,安迪 @ZhiyongWu: 很高兴 :)

以上是关于为啥#后跟一个数字似乎在C plus plus中啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

SQL*Plus BREAK 的行为如何/为啥取决于列顺序?

javascript ajax 调用通过仅使用 POST 方法的 fetch 调用:奇怪的行为是 post 后跟 get plus 再次请求所有资源?

c primer plus 章二

为啥 PLSQL 比 SQL*Plus 慢

windows下, sql plus 远程 连接oracle 不行,但是用客户端, plsql developer远程就可以, 这是为啥啊?

C语言-学习笔记 --《c primer plus》