C++ 代码在不同操作系统上的编译方式不同

标签 c++ ubuntu compilation operating-system

我想知道为什么 c++ 代码在不同版本的操作系统上编译不同。比如同样的代码在OS上编译时没有warning什么的,但是在不同的OS上编译同样的代码时就会有warnings或者error。

那么为什么会这样。是 gcc 版本之间的区别,还是在 Ubuntu 14 和 Ubuntu 16 等两个不同的操作系统上编译时实际上使 c++ 代码独一无二的原因。我只是想了解 c++ 代码对操作系统编译的独特之处。

最佳答案

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

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

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

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

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

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

关于C++ 代码在不同操作系统上的编译方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232006/

相关文章:

c++ - 如何从 OS X 终端编译带有多个类文件的 C++ 程序?

c++ - GLSL 着色器不适用于 AMD/ATI,但适用于 NVIDIA

ubuntu - 如何从命令行在网络浏览器中打开站点?

linux - vscode 总是请求保存权限

c - 包括静态库和头文件Makefile问题(C)

c++ - Windows 上的 CPU Miner 编译

c++ - 在字符串中为每个第N个字符插入空格的函数无法正常工作吗?

C++ atoi() 只返回第一个数字

c++ - 如何从主窗口访问另一个Windows ui?

ubuntu - 在虚拟机上运行的 Ubuntu 上检测 Nvidia 显卡