ChatGPT解决这个技术问题 Extra ChatGPT

在 C/C++ 预处理器中单独一行的单个井号/井号 (#) 的目的是什么?

我一直在查看 Boost 库源代码,我注意到通常有没有附加任何预处理器指令的单井号符号。我通读了 GCC 预处理器手册和规范指南,但找不到任何相关信息。

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

在第 4 行,井号之后没有任何内容。这有什么影响?它是否在 C 预处理器 (CPP) 规范中定义?

由于 Boost 是一个跨平台库,我认为任何 CPP 都应该正确解析它。在整个代码中使用随机的井号/哈希符号会产生什么影响/副作用?

@Zaibis 例如。 GCC 套件中预处理器的可执行名称是“cpp”(而编译器是 gcc 和 g++)
CPP 代表 C-Plus-Plus。
不是完全。见en.wikipedia.org/wiki/C_preprocessor的第一句
@djeidot“cpp”是模棱两可的。这就是为什么人们在提到 C-Plus-Plus 时使用“c++”或“cxx”(x 看起来像 + 转了 45 度)。
@djeidot 不,CPP 是 C-PreProcessor。它在 C++ 出现之前就已经存在了。

C
Community

一行中的 # 本身没有任何影响。我认为它被用于审美价值。

C标准说:

6.10.7 Null 指令语义 形式为#new-line 的预处理指令无效。

C++ 标准也说了同样的话:

16.7 Null 指令 [cpp.null] #new-line 形式的预处理指令无效。


然而,这并没有解释使用它的目的,也没有给出它存在的理由。
“这有什么影响?它是否在 C 预处理器 (CPP) 规范中定义?......在整个代码中使用随机井号/哈希符号会产生什么影响/副作用?”我就是这么回答的。没有任何作用,但我不想猜测作者使用它的原因。我现在已经这样做了。
你得到了正确的答案,它对预处理器没有任何意义;我将推测它可能有助于其他一些程序(例如 IDE 或 LINT)将指令块作为一个逻辑单元保持在一起。一些 IDE 允许程序员展开或折叠文本块,以帮助他们跟踪文件的逻辑结构。
P
P45 Imminent

它使源代码看起来很漂亮,仅此而已。

强调整个块是一个预处理器部分的事实。

事实上,C 和 C++ 预处理器必须忽略一行中的 #


并且还使某些文本编辑器中的导航更容易(例如,vim 中的 {})。
@WChargin,这取决于您如何看待它。如果您想在两个预处理器块之间导航,添加 # 会阻止您使用 {}。事实上,按 } 两次跳过该块(在 OP 的示例中)可能比不能跳转到两个块的中间更容易。
@Shahbaz 当然!我的经验法则是“将逻辑单元放在一起”,因此“段落”真正意味着“想法”。我也会在预处理器声明中遵循这条规则。当然,这在很大程度上是个人风格的问题。
C
Community

始终检查权威来源,而不是依赖其他资源。 C 被标准化为 ISO 9899::2011,C++ 也有一个 ISO 标准。两者都被广泛接受,并且通过简短的搜索即可获得最终草案。 6.10.7 中的 C 标准状态(C++ 有很多相同的文本):

#new-line 形式的预处理指令无效。

这是一个 null 指令,就像在核心语言中没有前面表达式的 ; 是一个 null 语句

对于预处理器,它只是为了格式化/可读性来突出这些行在语义上属于一起。 (分号 OTOH 在语义上是相关的)。