在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
在第四行,英镑符号后没有任何东西。 这有什么影响? 它是否在C预处理器(CPP)规范中定义?
由于Boost是一个跨平台的库,我会假设任何CPP都应该正确parsing它。 整个代码中的随机英镑/散列符号的效果/副作用是什么?
在一条线上一个#
完全没有效果。 我认为它被用于审美价值。
C标准说:
6.10.7空指令
语义
表单的预处理指令
# new-line
没有效果。
C ++标准也是这样说的:
16.7空指令[cpp.null]
表单的预处理指令
# new-line
没有效果。
它使源代码看起来很漂亮,就这些。
突出显示整个块是预处理器部分的事实。
事实上,C和C ++预处理器都必须忽略一行上的#
号。
始终检查权威来源,而不是依赖其他资源。 C被标准化为ISO 9899 :: 2011,C ++也有ISO标准。 两者都被广泛接受,并通过一个简短的search提供最终的草稿。 6.10.7中的C标准状态(C ++有很多相同的文字):
表单的预处理指令
# new-line
没有效果。
这是一个空指令 ,多达一个;
在核心语言中没有前面的expression式是一个空语句 。
对于预处理器来说,只是为了格式化/可读性来强调这些行在语义上属于一起。 (分号OTOH在语义上是相关的)。