Код C ++ компилируется по-разному на разных ОС - PullRequest
0 голосов
/ 08 сентября 2018

Мне было интересно, почему код на С ++ по-разному компилируется в разных версиях ОС. Например, когда один и тот же код соблюдается в ОС, предупреждение или что-либо еще не выводится, но когда тот же код выполняется в другой ОС, будут предупреждения или ошибки.

Так почему же это происходит? Разница между версиями gcc или то, что на самом деле делает код c ++ уникальным, когда он применяется на двух разных ОС, таких как Ubuntu 14 и Ubuntu 16. Я просто пытаюсь понять, как код c ++ уникален для компиляции ОС.

1 Ответ

0 голосов
/ 08 сентября 2018

C ++ как язык определяется его стандартом .Стандарт представляет собой огромный документ на языке адвоката, который определяет синтаксис языка, правила, стандартную библиотеку и некоторые рекомендации о том, как компиляторы должны правильно обрабатывать исходный код.Компиляторы, являющиеся связующим звеном между абстрактным языком и реальными исполняемыми программами, реализуются различными поставщиками или организациями, и должен придерживаться этого стандарта как можно ближе.На практике их корректность варьируется [1] .

Многие ошибки компилятора являются частью стандарта ( диагностика в стандарте), и поэтому в принципе должно быть по существуто же самое для компиляторов [2] .Предупреждения компилятора, как правило, являются менее техническими, и зачастую поставщики компиляторов часто пытаются помочь вам обнаружить типичные ошибки программирования, которые не являются технически некорректными программами.Программа может быть плохо сформирована в соответствии со стандартом, что означает, что она синтаксически неверна и не представляет собой реальную программу.Стандарты обязывают компиляторы выдавать диагностику для неправильно сформированной программы.

Однако существуют и менее тонкие и неправильные способы, которыми программы могут быть некорректными, например, при использовании так называемого стандарта * 1021.* неопределенное поведение (UB) и определяемое реализацией поведение .Это ситуации, когда в стандарте не указано, как компилятор должен корректно переводить исходный код в программу, и поставщики компилятора по закону могут действовать так, как им заблагорассудится.Хотя многие компиляторы могут создавать код, который примерно соответствует ожидаемому, вызывать неопределенное поведение в программе, как правило, очень плохая идея, поскольку нет никаких гарантий того, как ваша программа будет вести себя.Код с UB, который тихо компилируется и проходит тесты на одном компиляторе, может не пройти тесты или вообще не скомпилироваться, или столкнуться с ошибкой в ​​самый неподходящий момент на другом компиляторе.Ситуация становится слишком сложной, если вы используете специфичные для компилятора языковые расширения.

При столкновении с потенциальным UB некоторые компиляторы могут дать очень полезный совет, а другие могут быть обманчиво молчаливы.Лучшей практикой было бы ознакомиться с причинами UB, изучая C ++ из хорошего источника и внимательно читая документацию, Документация языка C ++ и из любых библиотек, которые вы можете использовать.

[1] Посмотрите на столбцы «Стандартное соответствие» списка компиляторов C ++ по адресу https://en.wikipedia.org/wiki/List_of_compilers#C++_compilers

[2] Сравнение сообщений об ошибках и предупреждений от трех очень популярных компиляторов: https://easyaspi314.github.io/gcc-vs-clang.html

...