在C / C ++预处理器中,单个磅/井号(#)在其自己的行上的目的是什么?

时间:2016-02-04 17:20:57

标签: c++ c boost c-preprocessor

我一直在查看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都应该正确解析它。在整个代码中使用随机井号/井号的影响/副作用会是什么?

3 个答案:

答案 0 :(得分:183)

线上的#根本没有效果。我认为它被用于美学价值。

C标准说:

  

6.10.7空指令

     

<强>语义

     

表单

的预处理指令      

# new-line

     

没有效果。

C ++标准说同样的事情:

  

16.7空指令[cpp.null]

     

表单

的预处理指令      

# new-line

     

没有效果。

答案 1 :(得分:107)

它使源代码看起来很漂亮,这就是全部。

突出显示整个块是预处理器部分的事实。

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

答案 2 :(得分:46)

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

  

表单

的预处理指令
# new-line
     

没有效果。

这是 null指令,核心语言中没有前导表达式的; null语句

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