【问题标题】:What does the "__cplusplus" macro expand to?“__cplusplus”宏扩展为什么?
【发布时间】:2018-09-29 14:57:50
【问题描述】:
  • C++ 宏 __cplusplus 包含什么并展开成什么?

  • __cplusplus 是否总是(即使在最旧的 C++ 实现中)包含并扩展为 numeric 值?

  • 使用#if __cplusplus安全吗? 还是我们应该使用 #ifdef __cplusplus 来代替?


结论(稍后添加)

来自 cmets 和接受的答案:

  • __cplusplus 扩展为代表标准版本的数字,除了 90 年代初期的标准 C++(简单扩展为 1)。

  • 是的,即使在最旧的 C++ 实现中(扩展为数值)。

  • 不,当标头与 C 语言共享时应该使用 #ifdef(因为某些 C 编译器会在 #if 检查未定义的宏时发出警告)。

【问题讨论】:

  • 对于 C,它应该是未定义的(除非你正在与恶意编译器编写器打交道);对于 C++,它应该被定义,可能是一个有用的值,但至少被定义。如果您想使用“即使是最古老的 C++ 实现”,请不要假设“它已被定义”。
  • 你认为什么是“最古老的 C++ 实现”? C++98?年纪大了?几岁?
  • 该问题最初用 C 标记,并且标题包含“C”而不是 C++。不过,这些标签主要是 C++ 标签。但是,C11 §6.10.8 Predefined macro names ¶3 说:实现不应预定义宏 __cplusplus,也不应在任何标准头文件中定义它。 C99 标准说的基本相同,在一个稍微不同的部分。 C90 标准对这个问题保持沉默。
  • 由于未定义的宏将扩展为假/零,我们只需要在定义时将 __cplusplus 评估为“真”,这样我们就可以缩短代码和条件
  • 长期以来g++将其定义为1。#ifdef是传统的测试方式,如果你改用#if,一些编译器会发出警告。

标签: c++ c++11 macros


【解决方案1】:

是的,它总是扩展为数值,其含义是正在使用的 C++ 标准的版本。根据 cppreference page__cplusplus 宏应该扩展为:

  • 199711L(C++11 之前),
  • 201103L (C++11),
  • 201402L (C++14),
  • 201703L (C++17)

#if#ifdef 指令之间的区别在于#ifdef 应该用于检查是否定义了给定的宏以允许编译一段代码。

另一方面,#if (#else, #elif) 指令可用于检查是否满足指定条件(就像典型的 if 条件一样)。

【讨论】:

  • 你确定是最旧的 C++ 版本吗?
  • 是的,C++98 标准明确说明了这一点——我签入了我的副本。
  • 感谢,这将在我当前的项目中节省许多按键和时间,在该项目中应该同时使用 C 和 C++ 的标头
  • 请注意,很长一段时间,__cplusplus 在某些编译器中只是简单地扩展为1
  • 当然,如果您在 90 年代初尝试使用准标准之前的 c++,那么该标准并不存在,就像现在您可以尝试使用 c++20 一样。如果您仍在使用这样的编译器,那么所有的赌注都没有了,但是您的理智必须受到质疑。 :-)
【解决方案2】:

__cplusplus 需要由 C++ 标准定义。对于 C++11 或更高版本,__cplusplus > 199711L 应持有true


宏 __cplusplus 是否总是,即使在最旧的 C++ 实现中, 包含并扩展为数值?

是的。


19.8C++11

__cplusplus

整数字面量 201703L。 [ 注:意在未来 本国际标准的版本将取代本标准的价值 具有更大价值的宏。 — 尾注 ]


C++98

__cplusplus名字 _ _cplusplus 在编译 C 时定义为值 199711L ++ 翻译单元。 143)

【讨论】:

  • 即使在最旧的 C++ 实现中它是否也会扩展为数值 - 因为我想在这种情况下使用“#if”而不是“#ifdef”
  • 你有c++标准相关章节的链接吗?
  • @Top-Master:为什么要使用#if?你会从中得到什么好处?
  • 使用 "#if" 而不是 "#ifdef" 也意味着我不需要在多条件情况下使用 "defined(...)" 这将缩短代码
  • @Top-Master 对我来说听起来像是一种虚假的经济。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2016-02-28
  • 2021-12-28
  • 2020-11-01
  • 2020-01-06
相关资源
最近更新 更多