如何将现有的C ++代码移植到C ++ 11

时间:2013-06-02 07:34:30

标签: c++ architecture c++11

我们正在开发一个用C ++开发的模块,但是考虑到新的C ++ 11,我正在考虑迁移到那个。

如何进行?两者是相同的还是有一些编译器依赖?

我的软件目前支持Windows和Linux。我正在使用Microsoft Visual Studio以及GCC来构建它。

总体而言,如果需要进行哪些更改?

4 个答案:

答案 0 :(得分:9)

旧的C ++将与您的C ++ 11编译器一起使用

  • 回顾你如何使用迭代器(也许你可以移动到范围)
  • 检查您是否使用函数指针(也许您可以使用lamdaes)
  • 查看类启动器(也许您可以编写初始化列表)
  • 查看您的指针使用情况(也许您可以切换到SmartPtr)
  • 使用指针查看您对NULL的使用,也许您可​​以转到nullptr

答案 1 :(得分:2)

编译器问题很少且易于解决。它比采用新的编译器容易得多。如果您有选择,请坚持使用您现在使用的std lib,然后在程序编译为C ++ 11后更新std lib。如果动态加载,您可能需要坚持使用旧版本的库。

如果您想利用新功能,请查看cpp11-migrate。当您还准备完全致力于c ++ 11时,假设您的编译器支持所有这些功能,此工具可以自动为您采用一些新功能。

答案 2 :(得分:2)

迁移?我认为WG21努力保持所有的兼容性。除非您使用导出,否则不需要迁移,现有代码就可以了。

我猜你真的意味着重构现有代码以获取C ++ 11功能的问题。在这里,我将运用关于重构的一般智慧 - 如果没有适当的目标和基于价值的动机,就永远不要这样做。

只是引入了新的闪亮功能并不会对您的代码施加技术负担。

我建议你开始在新代码中使用新功能,并且无论如何都要在重构的地方应用更自由的更改。并且只有当多种风格被认为是真正的痛苦时才开始思考一般重塑。 (C ++的多范式性质通常应该允许相当大的自由,并且偶尔强制统一的方法。)

从我关注的新功能:

  • 汽车。我的所有新代码都包含auto constauto const&本地人,省略了这些类型。好吧,有人建议globalreplace与我之前所说的相矛盾:如果你有使用for循环的话,用auto替换:: iterator用法。
  • lambdas,如果你使用具有一次性功能的algos
  • 新的线程内容,尤其是std::future,如果适用于项目

如果你碰巧使用'std :: auto_ptr'也可能是globalreplace的好候选人。

我遗漏了移动语义,因为我还没有跳过它们,不确定影响,所以我留给别人建议与否。

答案 3 :(得分:2)

正如其他人所指出的那样,你的代码可能编译得很好。如果你好奇什么可能出错,那就看看

What breaking changes are introduced in C++11?

如果您打算更改旧代码以使用C ++ 11功能,我会将auto添加到Baget's answer