什么是"便携式C ++"?

时间:2016-04-17 10:31:10

标签: c++

在互联网上,我看到声称用便携式C ++编写的库, 好像它是(可能是非官方的)标准。

是否有可移植C ++的精确定义,如果是,它是什么?

我没有要求编写可移植代码的常用做法,但如果真的有什么我们可以调用"便携式c ++"。

2 个答案:

答案 0 :(得分:8)

Portable C ++很模糊。

但是,如果要实现可移植性,只使用C ++标准库,而不使用特定于平台的代码(如Linux上的readwrite系统调用),没有特定于编译器的内在函数(如GCC& #39; s C / C ++扩展),或特定CPU的内联汇编。

请记住,即使这可能不是“便携式”#34;您可以为各种平台(包括嵌入式)编译C ++,并非所有这些平台都可能附带标准C ++库,或者具有支持最新和最好的C ++特性的编译器(C ++ 11,C ++ 14)想到了。)

无法实现真正​​的可移植性,但是,您可以为最常见的平台实现可移植性,或承诺支持这些X平台,并为每个平台构建特定于平台的解决方案(这是相当多的工作,并导致大量#ifdef OS1代码。

答案 1 :(得分:4)

可移植C ++代码意味着可以为(几乎)任何平台和任何实现编译此类代码。 所以目标是,如果程序应该运行

,这是不重要的
  • 不同的操作系统(windows,linux,OSX)
  • 不同的架构(x86,x86-64,钛,sparc,arm)
  • 不同的运行时库/编译器(gcc,clang,MSVC)

要实现这一目标,您必须考虑许多方面   - 不要使用实现定义的API和行为,只使用标准库   - 不要使用体系结构定义的假设和行为,例如char有8位,或负整数是2 - 补码和溢出或int是32位长等等

问题是,你经常需要使用C ++中没有标准的东西,比如网络接口。因此,库通常会尝试通过对预处理器选择的最常用系统使用不同的特定解决方案来解决此问题。

因此,您可以看到可移植性总是在上下文中看到,因为绝对可移植性是不可实现的。例如,可以为任何符合C ++ 11的编译器移植的C ++代码(但大多数编译器不是100%,参见MSVC 12/2013),或者是C ++ 11兼容编译器和POSIX系统的可移植代码(因此所有unix系统都可以用它)。等等。