【问题标题】:C++: Is all of "std" cross platform?C++:所有的“std”都是跨平台的吗?
【发布时间】:2013-01-21 05:21:20
【问题描述】:

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

【问题讨论】:

  • 只要你远离未定义的行为,就可以。
  • 只要您的编译器添加了对该功能的支持(例如 C++11),就可以
  • 假设有一个符合您编码内容的编译器。
  • 应该是,因为我经常在 windows/linux 上使用它
  • 谢谢!我真的很尴尬地问这个,但它没有出现在任何搜索中。希望这有适当的标签,以便人们将来可以简单地谷歌它。

标签: c++ cross-platform std standard-library


【解决方案1】:

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

这里有 multiple standards 需要关注 - C++98、C++03C++11C++14C++17work has started 上的 C++20。有时最新标准中的功能不会在每个编译器中实现。如果你坚持使用 C++03,你应该会找到广泛的一致性。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 非常好。如果组合不同的版本,即使来自同一个编译器,也不能保证模板能够正常工作。
    • 在这种情况下,为什么像 libFLAC (flac.sourceforge.net/api/classFLAC_1_1Decoder_1_1File.html) 这样的库会导出采用 std::string 参数的函数?
    • @us2012 如果它的 api 中的库使用任何 C++ 功能(重载、类、命名空间等),那么为了使用该库,您将被强制在你的编译器上编译它。供应商已经预先构建了一个库,或者为您提供了源代码,以便您自己构建它。
    • @us2012 - 因为这个问题有点过分了。 可能使用相同编译器和不同编译器开关编译的二进制文件不会互操作,但编译器供应商非常小心地避免此类问题。如果这是一个主要问题,那么编译器附带的标准库也将无法使用。
    • @Pete 编译器一起提供的标准库显然也是编译器一起编译的。
    【解决方案3】:

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

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

    【讨论】:

    • 评论将是您的位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多