Существует ли различие, если я компилирую следующую программу с помощью 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
Вы имеете в виду значок? Сделайте что-то вроде (где 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.
Теоретически должно быть одно отличие. Использование «//» для обозначения комментария не является частью C89, поэтому, если он правильно применяет правила C89, это приведет к ошибке компилятора (с -ansi -pedantic, он может это сделать, но я не помню для Конечно).
Это дает представление об общем характере: если программа компилируется как C89, она обычно также компилируется как C99 и дает точно такие же результаты. C99 в основном покупает вам некоторые новые функции, которых нет в C89, поэтому вы можете использовать (например) массивы переменной длины, которые не разрешены в C89.
Возможно, вам придется попросить педантичного применения правил, чтобы увидеть все различия - C99 предназначен для стандартизации существующей практики, а некоторые из существующих практик - это расширения gcc, некоторые из которых включены по умолчанию.
на этом форуме 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".