ТК (технические исправления или технические исправления) следует рассматривать как часть соответствующего базового стандарта.Итак, у вас действительно есть 4 возможных стандарта:
- ИСО / МЭК 9899: 1990 плюс ТК.
- ИСО / МЭК 9899: 1990 + AM1 (фактически 9899: 1995)плюс TC.
- ISO / IEC 9899: 1999 плюс TC.
- ISO / IEC 9899: 2011
Поправка 1 для C90 добавила новые заголовки и функции дляширокие наборы символов и многобайтовые символы, поэтому он содержит действительно новый стандартный материал.Технические исправления исправляют проблемы в стандартной формулировке, уточняя, что необходимо уточнить, и исправляя технические ошибки в документе.
Итак, я бы предположил, что этих четырех режимов будет достаточно:
-std=c90
-std=c95
-std=c99
-std=c11
Или, если мы собираемся заплатитьвнимание на ошибки, которые привели к проблемам 2000 года, то:
-std=c1990
-std=c1995
-std=c1999
-std=c2011
(Одним из преимуществ этого является то, что новейший стандарт имеет наибольшее число раз!)
Для автономных реализаций в четырех заголовках есть несколько отличийтребуется:
<stddef.h>
<limits.h>
<float.h>
<stdarg.h>
Был добавлен дополнительный макрос / функция, va_copy()
, добавленный к <stdarg.h>
в C99.
Исправление
Я только что проверил соответствующие части C99, и естьномер дополнительные заголовки, необходимые для автономной реализации в C99:
§4 Соответствие
¶6 Двумя формами соответствующей реализации являются hosted и отдельно стоящие. Соответствующая размещенная реализация должна принимать любую строго соответствующую программу.Соответствующая автономная реализация должна принимать любую строго соответствующую программу, которая не использует сложные типы и в которой использование функций, указанных в разделе библиотеки (пункт 7), ограничено содержимым стандартных заголовков <float.h>
, <iso646.h>
,<limits.h>
, <stdarg.h>
, <stdbool.h>
, <stddef.h>
и <stdint.h>
.Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции) при условии, что они не изменяют поведение любой строго соответствующей программы. 3)
3) Это означает, что соответствующая реализация не оставляет никаких идентификаторов, кроме тех, которые явно зарезервированы в настоящем международном стандарте.
§5.1.2.1 Отдельно стоящая среда
¶1 В автономной среде (в которой выполнение программы на С может происходить без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются реализацией.Любые библиотечные средства, доступные для автономной программы, кроме минимального набора, требуемого пунктом 4, определяются реализацией.
*2 Эффект завершения программы в автономной среде определяется реализацией.
В противном случае основные изменения произошли в основном языке в C99 - такие как новые типы (long long
), новые нотации инициализации, VLA и т. Д.,С этой точки зрения AM1 (C95) ничего не изменил для автономной реализации (если только тогда не были добавлены орграфы), потому что основные изменения были в новых заголовках, которые не требуются в автономной реализации.
Face of Hosted реализациймного других проблем, потому что поддержка библиотек была довольно сильно изменена между C90 и C99.
Было ли какое-либо изменение для автономных реализаций нарушать обратную совместимость?Другими словами, если у меня есть строго автономная программа, соответствующая C {1990, 1995, 1999,}, обязательно ли она будет компилироваться и работать, как ожидается, в соответствующей реализации C11?
Я не знаю о каких-либо проблемах обратной совместимости для автономных приложений, в отличие от размещенных реализаций. В C99 «неявные» правила int
официально утрачены - вы должны объявлять функции перед их использованием, а тип возвращаемого значения должен быть явно int
(так, например, простой main()
официально больше не действителен; вы следует написать int main()
или, что лучше, int main(void)
или аналогичный). Но это общие изменения между C90 (C95) и C99 - не свойственные автономным реализациям. (И да, я знаю, что для автономной реализации не требуется функция main()
в качестве начальной точки.) Если ваш код «хороший» и имеет функции, объявленные или определенные с прототипами перед использованием, и неявные типы int
( и все функции, определенные с использованием нотации прототипа, настоятельно рекомендуется), тогда то, что было хорошо для автономной программы C90, будет работать для C99 или C11.