我一直在查看 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 都应该正确解析它。在整个代码中使用随机的井号/哈希符号会产生什么影响/副作用?
一行中的 #
本身没有任何影响。我认为它被用于审美价值。
C标准说:
6.10.7 Null 指令语义 形式为#new-line 的预处理指令无效。
C++ 标准也说了同样的话:
16.7 Null 指令 [cpp.null] #new-line 形式的预处理指令无效。
它使源代码看起来很漂亮,仅此而已。
强调整个块是一个预处理器部分的事实。
事实上,C 和 C++ 预处理器必须忽略一行中的 #
。
{
或 }
)。
#
会阻止您使用 {
或 }
。事实上,按 }
两次跳过该块(在 OP 的示例中)可能比不能跳转到两个块的中间更容易。
始终检查权威来源,而不是依赖其他资源。 C 被标准化为 ISO 9899::2011,C++ 也有一个 ISO 标准。两者都被广泛接受,并且通过简短的搜索即可获得最终草案。 6.10.7 中的 C 标准状态(C++ 有很多相同的文本):
#new-line 形式的预处理指令无效。
这是一个 null 指令,就像在核心语言中没有前面表达式的 ;
是一个 null 语句。
对于预处理器,它只是为了格式化/可读性来突出这些行在语义上属于一起。 (分号 OTOH 在语义上是相关的)。