C++:"std"都是跨平台的吗?
C++: Is all of "std" cross platform?
我一直在尝试不同的搜索词来回答这个问题,但我在谷歌和stackoverflow上都发现了噪音。如果我使用C++的标准库(std)编写代码,是否基本上可以保证为Windows、Mac和Linux编译(并有望按预期工作)?
标准定义了什么是C++编译器,所有声称是C++的编译器都应该符合标准;任何没有的都可以被认为是有缺陷的。所有主要的编译者都尽力做到一致。
这里有多种标准需要关注——C++98、C++03、C++11、C++14、C++17,并且已经开始在C++20上进行工作。有时,当前最新标准中的功能不会在每个编译器中实现。如果你坚持使用C++03,你应该会发现广泛的一致性。
根据定义,std
命名空间中的所有内容都应该是标准的一部分。
代码保证在所有符合标准的编译器/平台之间兼容,但需要注意的是ABI不是,即您可能认为在不同编译器/版本/平台创建的二进制文件之间链接是不安全的。
在实践中,这意味着不要在一个库与另一个库之间传递像string
或vector
这样的STL对象,除非您在完全相同的时间以完全相同的方式编译这两个对象。在传递指向动态数据的指针时,这一点尤为重要:除非能够满足上述保证,否则不能在库API中使用shared_ptr
,而是需要使用常规指针。
论点是,任何不符合STL的东西都不符合C++,因此,从一个方面来说,是的,所有STL都是跨平台的。
但是,请注意,STL的某些部分是允许实现定义的。例如,请参阅type_info::name
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- 通过网络、跨平台传递std::变体是否安全
- std::numeric_limits<double>::quiet_NaN() 跨平台安全吗?
- Boost C++ 跨平台(Windows & Mac)序列化 std::wstring
- Std:ostream和跨平台兼容性
- std::to_string是跨平台的吗?
- C++:"std"都是跨平台的吗?
- 如何确定'std::map'创建的用于'boost::pool_allocator'的节点的大小(以跨平台方式)?
- 将 UTF8 转换为 std::wstring 的跨平台方式