ANSI C против других стандартов C
На нескольких компиляторах я использовал (все gcc
но разные версии) я получаю C99 mode
ошибка для таких вещей, как объявление int i
внутри выражения цикла for, а не перед ним (если я не использую std=c99
опция). Прочитав здесь, я понимаю, что gcc
опции -ansi
, -std=c89
, а также -std=iso9899:1990
все оценивают по стандарту ANSI C, но я не понимаю, почему / если я должен выбрать c89
стандарт против более нового стандарта, как c99
(что является самым новым, я предполагаю).
Кроме того, я вижу несколько версий iso
Стандарты типов для языка Си, первый из которых (из моего понимания) является прямым портом стандарта 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 ответа
Я не понимаю, почему / если я должен выбрать стандарт c89 по сравнению с более новым стандартом, таким как c99 (который я считаю самым новым).
Пара причин:
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 REGARDLESS того стандарта, который я компилирую?
Вы не можете написать это вторым способом в C89 (то есть с -pedantic
придерживаться стандарта), поэтому нет "независимо от того, какой стандарт". Версии C с расширениями GNU не являются стандартами, это "диалекты" (по крайней мере, так их называет man-страница). В C89 второй цикл недопустим, в C99 второй ограничивает область действия i
в петлю. Очевидно, что в обоих случаях первый цикл дает i
более широкий охват.
На самом деле, gcc не нравится второй цикл в C89 даже с включенными расширениями GNU.
C был стандартизирован как C89 ANSI. Затем он был стандартизирован ISO как C90; нет технических различий между C89 и C90.
C99 является пересмотром стандарта C; он был разработан комитетом ISO C и стандартизирован как ISO, так и ANSI. И C89, и C99 являются стандартами ANSI. На обычном языке фраза "ANSI C" обычно относится к C89; K&R 2-е изд. обложки книги только С89, а не С99.
Почему вы решили использовать старую версию C? Ну, есть как минимум две причины. Во-первых, у вас может быть компилятор, который не поддерживает C99 (например, Microsoft Visual C++ поддерживает только C89). Во-вторых, существует много устаревшего кода, который использует вещи из C89, которые не разрешены в C99 (вы можете увидеть больше в вопросе "Обратная совместимость C99"; он также ссылается на документ с обоснованием C99, который описывает различия).
Что касается "бонусного вопроса", вы не можете объявить переменную в инструкции for в C89; Вы можете в C99. В C89 первая часть оператора for является выражением.
У меня нет подробного объяснения стандартов Си.
Но моя позиция по умолчанию состояла в том, чтобы использовать C99, когда есть такая возможность. Тот факт, что это был последний разработанный стандарт, является одной из причин (у меня ошибочное мнение, что "чем новее, тем лучше").
Основная причина в том, чтобы я мог объявить переменные в циклах for.
C99 действителен:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89, ANSI и старше:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}
Реализация gcc на C99 еще не завершена, но вполне применима в повседневной жизни программистов. У меня нет ссылки под рукой, но для gcc где-то есть утверждение, что они переключатся на C99 (или просто на свой диалект gnu99) в день, когда эта реализация считается прекращенной.
Вопрос об использовании функций C99 или нет, разделен на прагматическую часть:
- для каких платформ мне нужно скомпилировать мой код
- какие функции я бы получил (на мой вкус много чистоты и простоты программирования переносимых)
и эмоциональная / идеологическая часть. Для последующего нет никакого лечения, кроме применения принципа динозавра.