3

我想开始过渡到在大型跨平台代码库中使用 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

想法?

4

2 回答 2

1

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

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

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

于 2012-05-12T19:07:35.377 回答
0

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

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

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

于 2012-05-12T20:03:04.470 回答