【问题标题】:Is there a preprocessor directive for detecting C++11x support? [duplicate]是否有用于检测 C++11x 支持的预处理器指令? [复制]
【发布时间】:2012-05-29 20:34:28
【问题描述】:

如果有一些代码我想尽可能多地使用 C++11x 扩展,但如果不支持则有一个后备。目前 OSX 版本的 GCC 和 VisualC 编译器几乎不支持 C++11x,所以我使用:

#if (defined(__APPLE__) || (defined(_WIN32)))
   ...fallback code without C++11x ...
#else
   ... code using C++11x ...
#endif

这是可行的,但实际上并不是正确的做法,尤其是因为 MacPorts 中的 gcc 编译器确实支持 c++11x。

#define C11X_SUPPORTED 类型的宏吗?也许只有 GCC 才有?

【问题讨论】:

标签: c++ gcc c-preprocessor preprocessor-directive


【解决方案1】:

__cplusplus 应在 C++11 之前的编译器中定义为 199711L,在支持 C++11 的编译器中定义为 201103L。这在实践中是否有很大帮助是另一个问题:大多数编译器只完成了一半,因此不应将其定义为 201103L,即使它们支持您感兴趣的功能。编译器并非闻所未闻谎言:例如,将其定义为199711L 并且不支持export 用于模板的编译器。但是没有按功能测试的标准功能。

最简单的解决方案是在确定所有编译器都支持之前不要使用任何特定的新功能。无论如何,您必须编写并支持回退代码;为什么要维护两个版本。该规则的一个例外可能是影响性能的新特性:编译器是否支持移动语义。在这种情况下,我建议您根据编译器文档和个人测试自己编写一个依赖于编译器的包含文件;仅仅因为编译器可能会记录它支持特定功能并不意味着它的支持是没有错误的。只需为每个目标编译器创建一个目录,将这个文件放在那里,然后在您的 makefile 或项目文件中指定适当的 -I/I 选项。

你的测试应该是这样的:

#ifdef HAS_MOVE_SEMANTICS
...
#endif

而不仅仅是编译器、版本或其他。

【讨论】:

  • “编译器撒谎并非闻所未闻”——而且 GCC 出人意料地说出了真相。或者更确切地说,某些版本可以。在大约 4.7-ish 之前,__cplusplus1,这是正确的,因为它不是 C++98 的完整实现。然后改为声明符合 C++98 模式。
  • @SteveJessop g++ 从未有过完整的 C++98 或 C++03 实现。它从未实现export。所以如果__cplusplus199711L,那就是在撒谎。 (当然,在这种情况下远非孤军奋战。)
  • 这就是我要说的,GCC 最近被改成撒谎,而之前它说的是真话。原因是无法判断它是在说没有实现 C++98 的真相,还是说没有实现 C++11 的真相。现在你可以区分它什么时候说的是实现 C++98,什么时候它说的是没有实现 C++11。伊皮。我认为没有人曾经实现过 C++98(或 C++03),所以__cplusplus 的确切值基本上是没用的。它总是特定于实现或撒谎。
  • @SteveJessop 这基本上就是我的观点。那里有正式的东西,但没用。
  • @JamesKanze:我认为export 是一个特例,因为它也从 C++03 / C++98 标准中删除,然后考虑一致性问题。原因是,它后来作为一个坏主意被放弃了,我认为只有一个实现支持它,或者差不多。而且我不确定效果如何。
【解决方案2】:

您可以检查__cplusplus 宏的值。对于 C++11,它大于 199711L

类似

#if __cplusplus > 199711L

#endif

【讨论】:

  • 需要注意的是目前还没有完整支持。
  • @juanchopanza 是的,这绝不保证完全支持 C++11,或者编译器完全支持 C++11(但它可能是你能得到的最好的)。
  • 另外需要注意的是编译器会撒谎。
  • 不幸的是,这在 MSVC 上不起作用,即使在 2021 年也是如此。
【解决方案3】:

Boost.Config 库提供了 granular preprocessor macros,您可以使用它来根据给定 C++11 功能的存在进行条件编译。

(对于编译器,C++11 支持不一定是全有或全无的主张。例如,考虑 Microsoft cherry picked which C++11 features 如何根据他们认为最有利于客户的内容将其包含在 Visual Studio 2012 中。)

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2011-04-15
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多