开发跨平台C ++ 11代码

时间:2012-01-14 12:21:14

标签: c++ cross-platform c++11

使用C ++ 03,可以(现在仍然)可以用MSVC和GCC编写跨平台代码,在Windows,Linux和Mac OS X之间共享C ++代码库。

现在,C ++ 11的情况如何?似乎不同的C ++编译器实现了C ++ 11的不同功能。要构建跨平台的C ++ 11代码,将MSVC10(VS2010)作为一种“最小公分母”是否安全?即,如果我们将已批准的C ++ 11功能限制为由MSVC10实现的功能,那么生成的C ++ 11代码是否可以与GCC编译(在Linux和Mac OS X上都可以使用)?

或者,如果我们需要跨平台代码,等待C ++ 11编译器成熟并坚持使用C ++ 03会更好吗?

感谢。

6 个答案:

答案 0 :(得分:2)

您可以使用GCC编译Windows代码。您不需要使用Microsoft的编译器。

如果您现在想要无痛地使用C ++ 11功能,那将是您最好的解决方案。微软仍然没有实现很多C ++ 11,也不是所有的都是在VS11中。

否则,是的,您显然可以使用代表最低公分母的编译器实现所支持的C ++ 11特性的子集。您需要检查并确保它是所有新功能的Microsoft编译器,而不仅仅是假设它是
我不相信GCC已经掌握了所有功能,并且无法保证所有功能的实现都是完美的,并且与微软的100%相匹配。编写完全可移植的代码一直很难。

仅使用C ++ 03功能显然是安全的方法,但它不允许您使用C ++ 11功能(显然)。相反或不重要的是只有你能做出的决定。

答案 1 :(得分:1)

C ++ 11还没有为黄金时间做好准备,正如你已经想到的那样。

不仅解析阶段仍然由各种编译器解决,但也存在一些问题,即一些人虽然接受某些功能,但可能在您目前的版本中存在怪癖和错误。

我能想到的唯一合理的方法是先选择你想要使用的编译器:

  • 你可以在Windows上使用gcc / Clang(使用libstdc ++)但是这会阻止你与VC ++编译的库进行交互
  • 另一方面,您可以验证gcc / Clang和VC ++的代码(如果需要,还可以验证其他一些代码)

一旦确定了要使用的编译器,就必须选择要使用的C ++ 11的功能,并且这些功能适用于所有这些编译器。

  • gcc可能是更先进的
  • Clang没有lambdas,但有移动语义和可变参数模板
  • VC ++是我认为最落后的

您需要在所有这些编译器上以及您所针对的所有平台上设置测试套件,并特别警惕可能的代码生成问题。我建议在Linux par示例中使用Valgrind,也可以在Windows上使用Purify(或等效),因为它们都有助于发现这些运行时问题。

请注意,VC ++和g ++都可能具有默认接受的非标准扩展,并且也可能基于C ++ 11的先前草案对代码进行解释。

老实说,对于生产用途,我认为这仍然有点不稳定。

答案 2 :(得分:0)

如果您正在编写新代码,那么明天可能不会发布它。

请计划您的发布日期。有些功能比其他功能更慢。主要是难以实现的功能和重复的功能(如循环范围)。

我不担心使用新的库功能,这些功能在所有编译器中都得到了很好的支持。

目前没有任何最小的共同点,因为微软决定首先专注于图书馆,而其余部分已经(主要)用于语言功能。

答案 3 :(得分:0)

Visual Studio对C ++ 2011的支持非常好,所以如果你使用GCC 4.7和VS2010,你将能够在跨平台时使用C ++ 2011最丰富的一些功能。

支持VC10和VC11的C ++ 11概述 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

所有编译器的表格: https://wiki.apache.org/stdcxx/C++0xCompilerSupport

GCC C ++ 11支持: http://gcc.gnu.org/projects/cxx0x.html

还相关:C++11 features in Visual Studio 2012

答案 4 :(得分:0)

这在很大程度上取决于您的项目。如果您只发送二进制文件,则需要确定要使用的工具集并坚持使用此工具集支持的内容。如果您的团队使用不同的工具,那么应该确保他的代码使用通用构建系统构建(无论是C ++ 03还是C ++ 11)。

只要您发送包含多个声明的标头,情况就会发生变化。首先,您需要一些基础结构来确定哪个编译器支持什么。您可以自己编写这些测试并将它们与构建系统集成,也可以坚持使用Boost.Config。比你可以ifdef平台相关的代码。这听起来很简单,但事实并非如此。每次使用C ++ 11代码都可以使用C ++ 03解决方法实现时,您希望为用户提供这两个版本(例如,可变参数模板与预处理器)。这导致重复的代码并且具有显着的维护成本。我通常只包含C ++ 11代码,如果它提供了明确的解决方案优势(更好的编译器错误消息(可变参数模板与宏),更好的性能(移动语义))。

答案 5 :(得分:0)

目前只使用C ++ 11的那些功能,以某种方式改进您的代码。 让我解释一下,我不会查找C ++ 11的功能来使用它们,而是当它们解决我的问题时我会采用它们。 (这是我了解它们的方式,一切都在SO上)这种方法将来会改变,但是现在我正在这样做。

我目前只使用c ++ 11的少数功能,这在VS2010和GCC中都很常见。 此外,如果有一个很棒的功能,你想使用,而VS没有它,为什么不使用GCC。它是跨平台的,因此也适用于Windows。