首页 > 解决方案 > 当一行中只有一个 `#` 时,C++ 预处理器会做什么 - 没有别的?

问题描述

这是一条有效的 C++ 行吗?它应该是什么意思?

#

这个如何:

# // a comment

最近的编译器似乎忽略了它,没有错误也没有警告。

它“什么都不做”吗?我有一个头文件,其中在存在此类行的情况下使用 g++ 7.4.0 编译时会出现“兼容性”部分。它似乎不会使编译器看到这一行被排除在非活动#if分支中。

注意:Travis CI 上的 Debian Bionic(撰写本文时)上的 gcc 7.4.0 被这些行绊倒了。

标签: c++language-lawyerc-preprocessor

解决方案


这两个例子都是有效的,它们什么都不做。

对于第二个示例,首先在翻译阶段 3中删除注释:

...每条评论都被一个空格字符替换。保留换行符。...

这导致第一种情况,这是在翻译阶段 4中扩展的预处理器指令:

执行预处理指令,...

这个预处理指令是有效的,被称为 a Null directive,并且没有任何效果,如此所述:

形式的预处理指令

# 新队

没有效果。

其中new-line实际上是换行符。

因此,您显示的代码是有效的,并且应该被符合要求的实现所接受。


推荐阅读