C++: “std” 是否跨平台?

13

我不停地尝试使用不同的搜索词来寻找答案,但在谷歌和stackoverflow上都只能找到噪音。如果我使用C++标准库(std)编写代码,它是否基本上可以保证在Windows、Mac和Linux上编译(并希望按预期工作)?


5
只要避免未定义行为,那么是的。 - Seth Carnegie
4
只要你的编译器已经加入了对该功能的支持(例如C++11),是的。 - Karthik T
假设你所编写的代码有符合规范的编译器。 - Rapptz
应该没问题,因为我经常在Windows/Linux上使用它。 - Satya
谢谢!我真的很不好意思问这个问题,但是在任何搜索中都没有出现。希望这个问题有适当的标签,以便人们将来可以通过谷歌轻松找到它。 - Jonathan
你应该注意实现定义的事情,因为它们可能不同。 - Ghasan غسان
3个回答

17
标准定义了什么是C++编译器,所有声称自己是C++编译器的编译器都应符合标准;任何不符合标准的编译器都可以被视为有缺陷的。所有主要的编译器都尽力符合标准。
这里需要关注多个标准 - C++98,C++03C++11C++14C++17已开始工作关于C++20。有时最新标准的功能不会在每个编译器中实现。如果您坚持使用C++03,应该能够找到广泛的一致性。
根据定义,std命名空间中的所有内容都应该是标准的一部分。

9

代码可以保证在所有符合标准的编译器/平台上兼容,但需要注意的是ABI不一定如此,也就是说您不能假设安全地链接来自不同编译器/版本/平台的二进制文件。

在实践中,这意味着不要将STL对象(如stringvector)从一个库传递到另一个库,除非您在完全相同的方式下同时编译了两者。当传递指向动态数据的指针时,这一点尤为重要:如果您无法满足上述保证,则不能在库API中使用shared_ptr,而必须改用普通指针。


1
非常好的观点。特别是模板,即使来自同一编译器的不同版本组合在一起,也无法保证能正常工作。 - Mark Ransom
3
为什么像libFLAC这样的库(http://flac.sourceforge.net/api/classFLAC_1_1Decoder_1_1File.html)会导出需要使用`std::string`参数的函数呢? - us2012
如果一个库在其API中使用了任何C++特性(重载、类、命名空间等),那么为了使用该库,您必须在您的编译器上强制编译它。要么库已经由供应商预构建,要么您会提供源代码以便自己构建它。 - Red XIII
@us2012 - 因为这个问题有点过度担忧了。使用相同编译器但不同编译开关编译的二进制文件互操作可能存在问题,但编译器供应商非常小心地避免出现这种问题。如果这是一个主要问题,随编译器一起提供的标准库也无法使用。 - Pete Becker
1
@Pete,随编译器一起提供的标准库显然也是使用编译器编译的。 - Mahmoud Al-Qudsi
@MahmoudAl-Qudsi - 是的,它们是相同的。该消息断言您必须“以完全相同的方式在完全相同的时间编译两者”。 - Pete Becker

1

这个观点是认为任何不符合STL标准的内容都不符合C++标准,因此在某种程度上,所有STL都是跨平台的。

但是,请注意,STL的某些部分允许被实现定义。例如,参见type_info::name


comment will be your place - Tony Dong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接