我一直在查看 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 空指令
语义学
表单的预处理指令
# new-line
没有效果。
C++标准也说了同样的话:
16.7 空指令 [cpp.null]
表单的预处理指令
# new-line
没有效果。
它使源代码看起来很漂亮,仅此而已。
突出显示整个块是预处理器部分的事实。
事实上,C 和 C++ 预处理器都必须忽略一行上的#
。
始终检查权威来源,而不是依赖其他资源。C 标准化为 ISO 9899::2011,C++也有 ISO 标准。两者都被广泛接受,最终草案可以通过简短的搜索获得。C 标准在 6.10.7 中声明(C++具有大致相同的文本):
表单的预处理指令
# new-line
没有效果。
这是一个空指令,就像核心语言中没有前面表达式的;
一样是空语句。
对于预处理器,它只是为了格式/可读性,以突出显示这些行在语义上属于一起。(分号 OTOH 在语义上是相关的)。