C89 по сравнению с компилятором c99 GCC

Существует ли различие, если я компилирую следующую программу с помощью 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 
9
задан skaffman 30 April 2010 в 20:18
поделиться

3 ответа

Вы имеете в виду значок? Сделайте что-то вроде (где self является UIViewController ):

[[self tabBarItem] setBadgeValue:@"42"];
-121--2381809-

Можно задать свойство badgeValue для UITabBarItem, чтобы предоставить пользователю небольшой красный значок на этом предмете.

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

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

Код имеет неопределенное поведение в C89 и четко определенное поведение в C99.

28
ответ дан 4 December 2019 в 06:40
поделиться

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

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

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

6
ответ дан 4 December 2019 в 06:40
поделиться

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

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

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

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

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

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

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

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

1
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: