我想开始转换到在大型跨平台代码库中使用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
思想?
答案 0 :(得分:1)
我建议你先从当前的编译器中找到C ++ 11特性的最大公分母。有关调查,请参阅:http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport
支持最广泛的功能包括auto
,decltype
和移动语义,因此您可以从使用这些功能重写代码开始,并为不支持特定功能的平台进行#define修复。大多数其他平台都支持(例如nullptr
)。
对于所有配置文件的文件组织,您可能需要检查Boost.Config的源代码。它包含多个目录,按平台和目的排序。例如。 config / platform / irix.hpp包含Irix的所有平台特定内容。
修改强>: 另一种模拟语言功能的好方法是查看Language Feature Emulation标签的Boost库。它们包含诸如Move,Foreach和以前的Lambda之类的库,它们具有与标准C ++ 11特性非常相似(尽管不一定完全相同)的语法。这允许您让Boost担心平台兼容性。
答案 1 :(得分:0)
自标准出版以来,时间已过。虽然通过boost可能几乎可以达到所有C ++ 11的功能,但今年可能不是启动这种类型迁移的最佳时机,除非你已经在这条路上,因为它会导致迁移两次。
所以我建议您在开始迁移之前再给编译器供应商一两年。同时,如果您认为C ++ 11在整个代码库中对您非常重要,请尝试停止支持任何不会出现更新编译器的废弃平台。
(事实上,永远不会完全将大型代码库迁移到语言标准的下一个版本,这是完全正常和常见的,但这与您目前使用的方式的问题无关。)