C ++代码在不同的OS上编译不同

问题描述 投票:2回答:1

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

那么为什么会这样呢? gcc版本之间的区别是什么实际上使得c ++代码在它遵循两个不同的操作系统(如Ubuntu 14和Ubuntu 16)时是唯一的。我只是想了解c ++代码是如何独特的OS编译。

c++ ubuntu compilation operating-system
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.