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

cal*_*ter 144 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
Run Code Online (Sandbox Code Playgroud)

在第4行,英镑符号后没有任何内容.这有什么影响?它是在C预处理器(CPP)规范中定义的吗?

由于Boost是一个跨平台的库,我认为任何CPP都应该正确解析它.在整个代码中使用随机井号/井号的影响/副作用是什么?

Jon*_*ely 185

一个#对自己上线有没有任何影响.我认为它被用于审美价值.

C标准说:

6.10.7空指令

语义

表单的预处理指令

# new-line

没有效果.

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

16.7空指令[cpp.null]

表单的预处理指令

# new-line

没有效果.

  • _"这有什么影响?它是在C预处理器(CPP)规范中定义的吗?...在​​整个代码中使用随机磅/散列符号会产生什么影响/副作用?"_这就是我回答的问题.它没有效果,但我不想推测作者使用它的原因.我现在已经这样做了. (8认同)
  • 但这并不能解释使用它的目的,也不能说明其存在的理由. (4认同)

P45*_*ent 107

它使源代码看起来很漂亮,就是这样.

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

事实上,C和C++预处理器都必须#在一条线上忽略.

  • 并且还使得在一些文本编辑器中导航变得更容易(例如,在vim中的`{`或`}`). (16认同)
  • @Shahbaz当然可以!我的经验法则是"将逻辑单元保持在一起",以便"段落"真正意味着"想法".我也会遵循这条规则和预处理器声明.当然,这在很大程度上是个人风格的问题. (3认同)

too*_*ite 46

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

表单的预处理指令

# new-line
Run Code Online (Sandbox Code Playgroud)

没有效果.

这是一个空指令,因为;核心语言中没有前面的表达式是一个空语句.

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

  • 不是downvoter,但也许是因为"检查C标准"并不是一件容易的事情.如果我不知道该搜索什么,我如何在标准中找到这几行?在标准中搜索`#`的所有实例?在这里问答案要快得多. (57认同)
  • 虽然我不得不指出,获取ISO标准的官方最新副本并不是*实际上是微不足道的(甚至是谷歌),而且我过去因引用非正式的标准草案而受到批评等等(是的,真的,即使是十多年来没有改变的措辞). (18认同)
  • "一般来说,如果你有牙痛,去理发师而不是牙医是个坏主意." ....啊?你说"新版本更明确地说明了我的意思",但我不知道你的类比应该是什么.为什么要阅读GCC预处理器手册以了解它对预处理器行为的说法(!)就像去找一个关于牙痛的理发师?你的评论"谷歌'标准'应该足够"也没有意义,因为@ioums的观点是在C标准内搜索*并不是微不足道的,不是很难找到标准本身. (14认同)
  • 不是一个downvoter,但我认为"下次更好直接检查C标准"是有点苛刻/粗鲁.说"像C标准中可以找到这些东西"这样的东西可能更合适. (9认同)
  • @haccks:我同意这与"下次更好地搜索谷歌"并没有什么不同,但那是因为它也有点粗暴/粗鲁.这些陈述粗鲁/苛刻的原因是因为它们是[居高临下](https://en.wiktionary.org/wiki/condescending). (9认同)
  • @Marged:我很感激,但这不是代表,但我真的想知道哪里没有用,或者可能会误导 - 可能是因为措辞不好.我总是试图提高我的语言技能. (4认同)
  • @KyleStrand:阅读理发师的内容.回去大约100年,你会看到他们也拔牙了.文化差异太大了.但你也可以使用内科医生而不是理发师.对于标准:我刚刚在信息页面添加了一个段落,等待审核(随意批准;-).为简单起见,我的答案中的链接是C11的最终草案(当前唯一有效的标准. (2认同)
  • 我问我的理发师*和我的牙医.我都没有弄清楚我在谈论什么.但我还没有投票刚刚开始阅读评论.一个轻松的笑话 (2认同)
  • @ioums我必须同意,用基本知识查找几乎所有与C有关的事情都是非常重要的.是的,那里有标准和来源,但C就是这样,对于初学者来说这些术语通常过于抽象,而不是高级语言的语法糖和简单语法 (2认同)