【问题标题】:C++11 upgrade techniques [closed]C ++ 11升级技术[关闭]
【发布时间】:2012-05-12 18:34:58
【问题描述】:

我想开始过渡到在大型跨平台代码库中使用 C++11。主要问题是所使用的编译器之间对 C++11 的支持程度不同。

除了在整个代码中乱扔宏指令外,是否有人对如何简化这种过渡有任何示例/建议?请提供特定功能的技术。例如:

// cpp11compat.h

// For compilers that do not have 'nullptr', we will define it as 'NULL'.
// Any misuses of 'nullptr' will be caught by C++11 compliant compilers.
// Obviously, this won't fix anything that depends on the type 'nullptr_t'
//
#ifdef STUPID_SUN_COMPILER
#define nullptr NULL
#endif

想法?

【问题讨论】:

  • 现在您有几个选择,查看所有编译器并找出它们共享的 c++11 的哪些功能,然后只使用这些功能,或者您可以继续使用当前的宏方案,所有编译器都有宏,将给出它们的名称和版本号。这将是一个糟糕的标题,虽然很糟糕。祝你好运!
  • @johnathon - 是的,那太好了,除了一些编译器在 C++11 支持方面几乎没有。我在看着你 SunStudio...
  • 真正要实现的是c++ 11还是新的。它仍然是一个婴儿,所以编译器支持将全面缺乏,当然 gcc 远远领先于其竞争对手,但即使是 IT 也无法支持所有 c++ 11。
  • 如果你需要支持非常老的编译器,这可能只是浪费时间。
  • overridefinal 也是关键字,可以很容易地替换为不支持这些的编译的定义。

标签: c++ c++11


【解决方案1】:

我建议您从找到当前编译器的 C++11 功能的最大公分母开始。有关调查,请参阅:http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport 最广泛支持的功能包括autodecltype 和移动语义,因此您可以从用这些重写代码开始,并对不支持大多数其他平台的特定功能的平台进行#define 修复支持(例如nullptr)。

对于所有配置文件的文件组织,您可能需要查看Boost.Config的源代码它包含几个目录,按平台和用途排序。例如。 config/platform/irix.hpp 包含 Irix 的所有平台特定的东西。

编辑: 模拟语言特性的另一个好方法是查看 Language Feature Emulation 标记的 Boost 库。它们包含诸如 Move、Foreach 和以前的 Lambda 之类的库,它们的语法与标准 C++11 功能非常相似(尽管不一定完全相同)。这使您可以让 Boost 担心平台兼容性。

【讨论】:

  • 这很容易。每个编译器的 C++11 特性集的交集当前是空集:-)
  • 我一般都喜欢这种方法,但不幸的是,这个共同点只有 一个 特征:long long。一点都不实用。这将是投降,而不是解决方案。
  • @MichaelPrice 所以你必须到处都有#define:一个使用 C++11 特性的类/函数的一个版本,一些使用没有C++11 的东西。您将拥有一个拆分代码库。唯一的问题是你如何在代码中组织它:通过头文件或通过#defines inline。
  • @rhalbersma - 一点也不。我正在寻求解决方案;如果他们不需要,他们就不必依赖宏。此外,对于我的nullptr 示例,唯一的#define 将出现在该单个头文件中,并且只要正确使用nullptr 就可以无缝工作。我正在寻找任何可以有效且安全地使用的简单技术。
【解决方案2】:

自该标准发布以来已经过去了很短的时间。虽然您可能可以通过 boost 实现几乎所有 C++11 功能,但今年可能不是开始此类迁移的最佳时机,除非您已经在这条路上,因为这会导致迁移两次。

所以我建议您在开始迁移之前再给编译器供应商一两年。同时,如果您认为 C++11 在整个代码库中对您非常重要,请尝试停止支持任何可能不会出现更新编译器的废弃平台。

(事实上,从不完全将大型代码库完全迁移到语言标准的下一个版本是完全正常和常见的,但这与您当前的措辞方式无关.)

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多