【问题标题】:Preprocessor macros in the C++ standardC++ 标准中的预处理器宏
【发布时间】:2017-09-19 14:57:07
【问题描述】:

我惊讶地发现ATOMIC_FLAG_INIT 被描述为在 C++11 标准中定义的预处理器宏。这是一个例外,还是新的 C++ 标准真的涵盖了预处理器步骤?

对我来说,预处理器实际上是一种自己的语言,而现在的趋势似乎是不鼓励使用它。

【问题讨论】:

  • 顺便说一句,标准中的另一个宏示例是 assert,虽然继承自 c。
  • 我认为这可能切入了它的要点。 C 不支持模板,因此它是预处理或编译时包含决策之类的东西。 C++ 寻求与 C 保持相当密切的关系,因此无论其相对优点如何,预处理器都不会去任何地方。
  • #include 是一个预处理器指令。 (只是说)。

标签: c++ c++11 c-preprocessor


【解决方案1】:

当然,C++ 标准涵盖了预处理器;事实上,有a whole chapter on it in the standardthird and fourth phases of translation 主要处理预处理器。

C++ 标准还指定了many predefined macrosassert 也是一个宏,就像您发现的原子初始化器一样。

在某些情况下宏仍然有用,但许多最常见的用例被最新 C++ 标准的功能更好地覆盖,例如 constexpr 函数/变量。

【讨论】:

  • 我并不是说 C++ 标准不包含预处理器,而是让我惊讶的是,新增的内容(C++11 及更高版本)仍然添加了依赖它的东西, 当它不是“现代” C++ 的一部分时(或者至少它看起来是这样的)。
  • 它绝对是“现代”C++ 的一部分;但是正如我在答案中提到的,宏的一些以前常见的用途(这只是预处理器所做的一部分)可以通过 C++11 以后的其他功能更好地解决。这可能会让它看起来不那么现代,但这主要是因为它不会像经常那样成为合适的工具。
猜你喜欢
  • 2013-07-16
  • 2020-02-09
  • 2014-04-30
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多