【问题标题】:C++ code compiles differently on different OSC++ 代码在不同操作系统上的编译方式不同
【发布时间】:2018-09-08 04:26:37
【问题描述】:

我想知道为什么 c++ 代码在不同版本的操作系统上编译不同。例如,在操作系统上编译相同的代码时,不会出现警告或任何东西,但是当在不同的操作系统上编译相同的代码时,就会出现警告或错误。

那么为什么会发生这种情况。 gcc 版本之间的区别是什么,或者当 c++ 代码在两个不同的操作系统(如 Ubuntu 14 和 Ubuntu 16)上编译时,它实际上是什么使 c++ 代码独一无二。我只是想了解 c++ 代码对操作系统编译的独特之处。

【问题讨论】:

  • 我们能看到产生这种行为的代码吗?如果您有良好的符合标准的代码,它应该可以在所有平台上编译。
  • 编译器会警告您他们认为可能是错误的代码。它们不一定是错误。它们是特定于编译器的并且不断发展。如果编译器版本不同,如果他们对哪些代码结构可能错误的评估不同,我不会感到惊讶。
  • 如果您的代码包含未定义的行为(或其他错误),那么任何事情都可能发生。但是如果不看代码示例就无法判断。

标签: c++ ubuntu compilation operating-system


【解决方案1】:

C++ 作为一种语言由其standard 定义。该标准是一个巨大的律师行话文档,它定义了语言的语法、规则、标准库以及一些关于编译器应该如何正确处理源代码的指南。编译器是抽象语言和实际可执行程序之间的桥梁,由不同的供应商或组织实现,并且应该尽可能地遵守该标准。在实践中,它们的正确性各不相同[1]

许多编译器错误是标准的一部分(诊断在标准中),因此原则上应该在编译器之间基本相同[2]。编译器警告通常技术性较低,并且通常是编译器供应商试图帮助您捕获在技术上不是格式错误的程序的常见编程错误的方式。根据标准,一个程序可能是格式错误的,这意味着它在语法上是无效的并且不代表一个真实的程序。标准要求编译器为格式错误的程序发出诊断。

不过,程序可能会以更小、更微妙的方式出错,例如使用标准所指的undefined behavior (UB) and implementation-defined behavior。在这些情况下,标准没有指定编译器应该如何正确地将源代码翻译成程序,并且编译器供应商在法律上被允许按照他们喜欢的方式进行。虽然许多编译器生成的代码可能与您期望的差不多,但在程序中调用未定义的行为通常是一个非常糟糕的主意,因为无法保证您的程序将如何运行。在一个编译器上安静地编译并通过测试的 UB 代码可能会在另一个编译器上测试失败或完全编译失败,或者在最坏的时间遇到​​错误。如果您使用特定于编译器的语言扩展,情况也会变得棘手。

当面对潜在的 UB 时,一些编译器可能会提供非常有用的建议,而其他编译器可能会误导性地保持沉默。最佳做法是通过从 a good source 学习 C++ 并仔细阅读 C++ language documentation 和您可能使用的任何库的文档来熟悉 UB 的原因。

[1] 查看https://en.wikipedia.org/wiki/List_of_compilers#C++_compilers 上的 C++ 编译器列表的“标准一致性”列

[2] 来自三个非常流行的编译器的错误消息和警告的比较:https://easyaspi314.github.io/gcc-vs-clang.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2018-05-27
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多