C++:"std"都是跨平台的吗?

C++: Is all of "std" cross platform?

本文关键字:跨平台 std C++      更新时间:2023-10-16

我一直在尝试不同的搜索词来回答这个问题,但我在谷歌和stackoverflow上都发现了噪音。如果我使用C++的标准库(std)编写代码,是否基本上可以保证为Windows、Mac和Linux编译(并有望按预期工作)?

标准定义了什么是C++编译器,所有声称是C++的编译器都应该符合标准;任何没有的都可以被认为是有缺陷的。所有主要的编译者都尽力做到一致。

这里有多种标准需要关注——C++98、C++03、C++11、C++14、C++17,并且已经开始在C++20上进行工作。有时,当前最新标准中的功能不会在每个编译器中实现。如果你坚持使用C++03,你应该会发现广泛的一致性。

根据定义,std命名空间中的所有内容都应该是标准的一部分。

代码保证在所有符合标准的编译器/平台之间兼容,但需要注意的是ABI不是,即您可能认为在不同编译器/版本/平台创建的二进制文件之间链接是不安全的。

在实践中,这意味着不要在一个库与另一个库之间传递像stringvector这样的STL对象,除非您在完全相同的时间以完全相同的方式编译这两个对象。在传递指向动态数据的指针时,这一点尤为重要:除非能够满足上述保证,否则不能在库API中使用shared_ptr,而是需要使用常规指针。

论点是,任何不符合STL的东西都不符合C++,因此,从一个方面来说,是的,所有STL都是跨平台的。

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