6

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

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

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

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

4

4 回答 4

9

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

  • 回顾你如何使用迭代器(也许你可以转向 range-for)
  • 检查你是否使用函数指针(也许你可以使用 lamdaes)
  • 查看类发起者(也许你可以写初始化列表)
  • 查看您的指针使用情况(也许您可以切换到 SmartPtr)
  • 使用指针检查您对 NULL 的使用,也许您可​​以移至 nullptr
于 2013-06-02T10:26:28.893 回答
2

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

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

于 2013-06-02T10:58:32.840 回答
2

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

我猜你的意思是重构现有代码以获取 C++11 特性的问题。在这里,我将应用关于重构的一般智慧——如果没有正确的目标和基于价值的动机,永远不要这样做。

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

我建议您开始在新代码中使用新功能,并在您出于不同原因进行重构的地方应用更自由的更改。只有当拥有多种风格被认为是一种真正的痛苦时,才开始考虑重塑。(C++ 的多范式性质通常应该允许相当大的自由度,并且只偶尔强制统一方法。)

从我关注的新功能中:

  • 汽车。我所有的新代码都充满了auto const本地人auto const&省略了类型。好的,一个建议 globalreplace 与我之前所说的相矛盾:如果您有使用它们的 for 循环,请用 auto 替换 ::iterator 用法。
  • lambdas,如果您使用带有一次性功能的算法
  • 新线程的东西,特别是std::future如果适用于项目

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

我省略了移动语义,因为我还没有跳过它们,不确定影响,所以我把它留给其他人建议或不建议。

于 2013-06-02T11:14:11.807 回答
2

正如其他人指出的那样,您的代码可能会编译得很好。如果您很好奇可能会出现什么问题,请参阅

C++11 中引入了哪些重大变化?

如果您打算更改旧代码以使用 C++11 功能,我会添加autoBaget 的答案中。

于 2013-06-02T13:51:23.903 回答