ANSI C против других стандартов C - PullRequest
29 голосов
/ 24 сентября 2010

В нескольких используемых мной компиляторах (все gcc, но в разных версиях) я получаю ошибку C99 mode для таких вещей, как объявление int i внутри выражения цикла for вместо него (если я не использую std=c99 вариант). После прочтения здесь я понимаю, что все параметры gcc -ansi, -std=c89 и -std=iso9899:1990 соответствуют стандарту ANSI C, , но я не понимаю, почему / если я следует выбрать стандарт c89 по сравнению с более новым стандартом, таким как c99 (который, как я полагаю, является самым новым).

Кроме того, я вижу несколько версий стандартов типа iso для языка C, первая из которых (насколько я понимаю) является прямым портом стандарта ANSI. Можно ли с уверенностью сказать, что iso обновит свой стандарт для C, но исходный стандарт ANSI для C всегда будет одинаковым?

Бонусный вопрос:

Я на самом деле могу понять это сам, я просто еще не нашел время, чтобы сделать это, так что, если кто-то знает по макушке, то это здорово, иначе нет, я не пойму позже:)

У меня довольно новый отпечаток книги The C Programming Language (ANSI). Моя книга всегда показывает такие циклы:

int i;

for(i = 0; i < foo; i++)

но многие люди (большинство из которых обладают большим программистским талантом в своем мизинце) пишут свои циклы for следующим образом:

(int i = 0; i < foo; i++)

Правильно ли говорить, что если я пишу цикл первым способом, тогда i должен быть доступен для всей функции, но если я пишу это вторым способом, тогда i доступен только для цикла for Безразлично какого стандарта я компилирую? Другой способ задать тот же вопрос: если я скомпилирую по стандарту c89, будет ли i обоих циклов for доступным для всей функции, а если я скомпилирую по стандарту c99, то i первого цикл for будет доступен для всей функции, в то время как i второго цикла for будет доступен только для цикла for?

Ответы [ 4 ]

20 голосов
/ 24 сентября 2010

Я не понимаю, почему / если я должен выбрать стандарт C89 по сравнению с более новым стандарт как с99 (который является самым новым Я предполагаю).

Пара причин:

1) Поддержка gcc C99 не является полной, в то время как поддержка C89 есть. Вот почему C89 (с расширениями GNU) используется по умолчанию. Так что, если вы абсолютный сторонник программирования по стандарту с использованием gcc, выберите C89.

2) Компилятор Microsoft вообще не поддерживает C99. Так что если вы хотите написать переносимый код на C, C89 - это общий стандарт.

Можно с уверенностью сказать, что iso обновится их стандарт для C, но оригинал Стандарт ANSI для C всегда будет то же самое?

Нет, ISO C99 также был утвержден в качестве стандарта ANSI. Название «ansi», которое прилагается только к C89, является несчастной исторической случайностью. Тем не менее, C89 всегда будет C89, просто это не самый последний стандарт ANSI C.

Правильно ли говорить, если я напишу первый цикл, то я должен быть доступны для всей функции, но если я напишу это вторым способом, то я доступно только для цикла for Независимо от того, какой стандарт я компилирую с

Вы не можете написать это вторым способом в C89 (т. Е. С -pedantic, чтобы придерживаться стандарта), поэтому здесь нет «независимо от того, какой стандарт». Версии C с расширениями GNU не являются стандартами, это «диалекты» (по крайней мере, так их называет man-страница). В C89 второй цикл недопустим, в C99 второй ограничивает область действия i циклом. Очевидно, что в обоих случаях первый цикл дает i более широкий охват.

На самом деле, gcc не нравится второй цикл в C89 даже с включенными расширениями GNU.

20 голосов
/ 24 сентября 2010

C был стандартизирован как C89 ANSI. Затем он был стандартизирован ISO как C90; нет технических различий между C89 и C90.

C99 является пересмотром стандарта C; он был разработан комитетом ISO C и стандартизирован как ISO, так и ANSI. И C89, и C99 являются стандартами ANSI. На обычном языке фраза «ANSI C» обычно относится к C89; K & R 2-е изд. обложки книг только C89, а не C99.

Почему вы решили использовать старую версию C? Ну, есть как минимум две причины. Во-первых, у вас может быть компилятор, который не поддерживает C99 (например, Microsoft Visual C ++ поддерживает только C89). Во-вторых, существует много устаревшего кода, который использует вещи из C89, которые не разрешены в C99 (вы можете увидеть больше в вопросе «Обратная совместимость C99» ; он также ссылается на обоснование C99, описывает различия).

Что касается «бонусного вопроса», вы не можете объявить переменную в инструкции for в C89; Вы можете в C99. В C89 первая часть оператора for является выражением.

2 голосов
/ 24 сентября 2010

У меня нет подробного объяснения стандартов С.

Но моя позиция по умолчанию - использовать C99, когда есть такая возможность. Тот факт, что это был последний разработанный стандарт, является одной из причин (у меня ошибочное мнение, что «чем новее, тем лучше»).

Основная причина в том, что я могу объявить переменные в циклах for.

C99 действует:

for (int i = 0; i < 100; i++)
{
   doSomething();
}

C89, ANSI и старше:

int i;
for (i = 0; i < 100; i++)
{
   doSomething();
}
0 голосов
/ 24 сентября 2010

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

Вопрос об использовании функций C99 или нет, разделен на прагматическую часть:

  • для каких платформ мне нужно скомпилируйте мой код
  • какие функции я бы приобрел (на мой вкус - большая чистота и простота программирования)

и эмоционально-идеологическая часть. Для последующего нет никакого лечения, кроме применения принципа динозавра.

...