我想开始在一个大型的跨平台代码库中使用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有什么想法?
发布于 2012-05-12 19:07:35
我建议您从当前编译器找到C++11特性的最大公分母开始。有关调查,请参阅:http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport最受支持的特性包括auto、decltype和move语义,因此您可以从使用这些特性重新编写代码开始,并对不支持大多数其他平台支持的特定功能的平台(例如nullptr)进行#define修复。
对于所有配置文件的文件组织,您可能需要检查Boost.Config的源代码--它包含按平台和用途排序的几个目录。例如config/ platform /irix.hpp包含所有特定于Irix的平台内容。
编辑:模拟语言特性的另一个好方法是查看语言特征仿真标记的Boost库。它们包含像Move、Foreach和以前的Lambda这样的库,它们的语法与标准的C++11特性非常相似(尽管不一定完全相同)。这允许您让Boost担心平台兼容性。
发布于 2012-05-12 20:03:04
自该标准公布以来,几乎没有时间过去。虽然您可能可以通过boost实现几乎所有的C++11特性,但除非您已经走上了这条道路,否则今年可能不是启动这种迁移的最佳时机,因为这将导致迁移两次。
因此,我建议您在开始迁移之前再给编译器供应商一年或两年的时间。同时,如果您觉得C++11在整个代码库中对您非常重要,那么尝试停止支持任何可能不会出现更新编译器的废弃平台。
(事实上,永远不要将一个大型代码基迁移到语言标准的下一个版本是非常好和常见的,但这与您的问题与它当前的措辞方式无关。)
https://stackoverflow.com/questions/10566389
复制相似问题