在 C/C++ 预处理器中,单个井号/哈希符号 (#) 在自己的行上有什么用

What is the purpose of a single pound/hash sign (#) on its own line in the C/C++ preprocessor?

本文关键字:自己的 什么 哈希 预处理 C++ 处理器 单个井 符号      更新时间:2023-10-16

我一直在查看 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 在语义上是相关的)。