Компилятор C89 против C99 GCC - PullRequest
8 голосов
/ 16 февраля 2010

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

#include <stdio.h>

    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 

Ответы [ 3 ]

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

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

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

6 голосов
/ 16 февраля 2010

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

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

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

1 голос
/ 16 февраля 2010

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

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

A) ANSI X3.159-1989. Это оригинальный стандарт 1989 г., датированный Декабрь 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", с его Массивы переменной длины, гибкие элементы массива, новые ключевые слова, такие как "restrict" и "_Bool", новая семантика для ключевого слова "static", new синтаксис для создания анонимных агрегатов, новые типы комплексных чисел, сотни новых библиотечных функций и т. д.

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

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

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

...