13

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

4

3 回答 3

17

该标准定义了 C++ 编译器的含义,所有声称是 C++ 的编译器都应符合该标准;任何不可以被认为是错误的。所有主要的编译器都尽最大努力保持一致。

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

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

于 2013-02-06T04:57:19.627 回答
9

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

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

于 2013-02-06T04:58:18.643 回答
1

争论是任何不符合 STL 的东西都不符合 C++,因此,在一方面,是的,所有 STL 都是跨平台的。

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

于 2018-01-08T23:28:06.727 回答