Intereting Posts
Почему существуют разные определения INT64_MIN? И почему они ведут себя по-другому? Является ли законным изменять любой указатель данных через пустоту ** Несколько ошибок LNK2005 предупреждение: функция возвращает адрес локальной переменной Как извлечь полуточные частоты из WAV-файла с использованием преобразований Фурье Почему scanf не нуждается в амперсанде для строк, а также отлично работает в printf (в C)? Логический оператор И Выделение (статически) памяти при загрузке ядра Строковые литералы, вызывающие небольшую утечку памяти? как запустить java-программу из программы ac? SSE оптимизированный код работает аналогично простой версии Можно ли динамически определить структуру в C Как работает оператор запятой во время назначения? Куда поставить включенные утверждения, заголовок или источник? двоичный поиск – если я добавлю или вычитаю «1» из середины списка, получу ли первое число слева от среднего или числовое значение?

C89 vs c99 Компилятор GCC

Есть ли разница, если я скомпилирую следующую программу, используя c89 vs c99? Я получаю тот же результат. Есть ли разница между этими двумя?

#include  int main () { // Print string to screen. printf ("Hello World\n"); } gcc -o helloworld -std=c99 helloworld.c vs gcc -o helloworld -std=c89 helloworld.c 

  • // комментарии не являются частью C89, но в порядке C99,
  • отказ от main() без возврата какого-либо значения эквивалентен return 0; в C99, но не так на C89. От N1256 (pdf), 5.1.2.2.3p1:

    Если тип возврата main функции является типом, совместимым с int , возврат от начального вызова к основной функции эквивалентен вызову функции exit со значением, возвращаемым main функцией в качестве аргумента; достигая } который завершает main функцию, возвращает значение 0.

Таким образом, ваш код имеет неопределенное поведение на C89 и четко определенное поведение на C99.

Теоретически, должно быть одно различие. Использование «//» для разметки комментария не является частью C89, поэтому, если он правильно правил C89, это приведет к ошибке компилятора (с -ansi -pedantic, возможно, это возможно, но я не помню, чтобы конечно).

Это дает представление об общем характере: если программа компилируется как C89, она обычно также компилируется как C99 и дает точно такие же результаты. C99 в основном покупает вам некоторые новые функции, которых нет в C89, поэтому вы можете использовать (например) массивы переменной длины, которые не разрешены на C89.

Возможно, вам придется попросить соблюдения правил педантизма, чтобы увидеть все различия, но C99 предназначен для стандартизации существующей практики, а некоторые из существующих практик – расширения gcc, некоторые из которых включены по умолчанию.

на этом форуме http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html Я нашел это:

summary: 99 стандартизирован, имеет новые ключевые слова, новый массив, сложные номера, библиотечные функции и т. д. Больше компиляторов завершено c89, так как у них было все это время, чтобы сделать их такими.

A) ANSI X3.159-1989. Это оригинальный стандарт 1989 C, датированный декабрем 1989 года, с Обоснованием. Основная часть языка описана в разделе 3, а «C-библиотека» – stdio, функции и т. Д. – в разделе 4.

B) ISO 9899: 1990. Это оригинальный стандарт ISO C. «ANSI» – это Американский национальный институт стандартов, поэтому международная толпа должна иметь свои собственные стандарты со своей собственной, различной системой нумерации. Они просто приняли стандарт ANSI 1989 года, удалили Обоснование и перенумеровали разделы (вместо этого называя их «оговорками»). За очень немногими исключениями вы можете просто добавить три, так что большая часть языка описана в разделе – er, «clause» – 6 и «C library» в разделе 7.

C) ISO 9899: 1999. Это новомодный стандарт «C99» с его массивами переменной длины, гибкими членами массива, новыми ключевыми словами, такими как «ограничение» и «_Bool», новая семантика для «статического» ключевого слова, новый синтаксис для создания анонимных агрегатов, новый комплексный номер типы, сотни новых функций библиотеки и т. д.

Новый стандарт ISO был сразу «принят» ANSI. Я не видел никаких официальных утверждений, утвержденных ANSI, но, учитывая обычные системы нумерации, я бы ожидал, что это будет стандартным номером ANSI X3.159-1999. (Система нумерации довольно очевидна: стандарт, как только он появляется, получает число – X. для ANSI или просто число для ISO – и суффикс, указывающий год публикации. Обновление существующего стандарта повторно использует номер, с новым годом.)

Хотя X3.159-1989 и 9899: 1990 имеют разные годы и нумерацию разделов, они фактически идентичны, поэтому «C89» и «C90» действительно относятся к одному и тому же языку. Следовательно, вы можете сказать «C89» или «C90» и означать одно и то же, даже для тех, кто знает обо всех тонкостях.

Также были внесены несколько небольших изменений в первоначальный стандарт ISO 1990: «Нормативное добавление 1» и две «Технические исправления» (пронумерованы, даны технические исправления 1 и TC2). Два ТС считаются «исправлениями ошибок» для глюков в формулировке стандарта, а NA1 является фактическим «изменением». На практике ТС на самом деле не влияют на пользователей, а NA1 добавляет множество функций, которые люди могут использовать, поэтому NA1 действительно более значителен. NA1 вышел в 1994 году, поэтому можно было бы назвать «ISO 9899: 1990 с изменением NA1» как «C94». Я видел его также под названием «C95».