【问题标题】:What is the purpose of a single pound/hash sign (#) on its own line in the C/C++ preprocessor?在 C/C++ 预处理器中单独一行上的单个井号/井号 (#) 的目的是什么?
【发布时间】:2016-05-14 10:45:34
【问题描述】:

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

【问题讨论】:

  • @Zaibis 例如。 GCC 套件中预处理器的可执行名称是“cpp”(而编译器是 gcc 和 g++)
  • CPP 代表 C-Plus-Plus。
  • 不完全。见en.wikipedia.org/wiki/C_preprocessor第一句
  • @djeidot "cpp" 不明确。这就是为什么人们在提到 C-Plus-Plus 时使用“c++”或“cxx”(x 看起来像 + 转了 45 度)。
  • @djeidot 不,CPP 是 C-PreProcessor。它在 C++ 出现之前就已经存在了。

标签: c++ c boost c-preprocessor


【解决方案1】:

# 在一行上本身没有任何作用。我认为它被用于审美价值。

C 标准说:

6.10.7 空指令

语义

表单的预处理指令

# new-line

没有效果。

C++ 标准也是这么说的:

16.7 空指令 [cpp.null]

表单的预处理指令

# new-line

没有效果。

【讨论】:

  • 这并没有解释使用它的目的,也没有给出它存在的理由。
  • “这有什么影响?它是在 C 预处理器 (CPP) 规范中定义的吗?...在​​整个过程中使用随机井号/哈希符号会产生什么影响/副作用?代码?” 这就是我的回答。没有任何作用,但我不想猜测作者使用它的原因。我现在已经这样做了。
  • 你得到了正确的答案,它对预处理器没有任何意义;我将推测它可能有助于其他一些程序(例如 IDE 或 LINT)将指令块作为一个逻辑单元保持在一起。一些 IDE 允许程序员展开或折叠文本块,以帮助他们跟踪文件的逻辑结构。
【解决方案2】:

它使源代码看起来很漂亮,仅此而已。

强调整个块是一个预处理器部分。

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

【讨论】:

  • 并且在某些文本编辑器中也使导航更容易(例如,{} 在 vi​​m 中)。
  • @WChargin,这取决于您如何看待它。如果您想在两个预处理器块之间导航,添加# 会阻止您使用{}。实际上,按两次} 跳过该块(在OP 的示例中)可能比无法跳转到两个块的中间更容易。
  • @Shahbaz 当然可以!我的经验法则是“将逻辑单元放在一起”,因此“段落”真正意味着“想法”。我也会在预处理器声明中遵循这条规则。当然,很大程度上是个人风格的问题。
【解决方案3】:

始终检查权威来源,而不是依赖其他资源。 C 被标准化为 ISO 9899::2011,C++ 也有一个 ISO 标准。两者都被很好地接受,并且通过简短的搜索即可获得最终草案。 6.10.7 中的 C 标准状态(C++ 有很多相同的文本):

表单的预处理指令

# new-line

没有效果。

这是一个 null 指令,就像在核心语言中没有前面表达式的 ; 是一个 null 语句

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多