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 или нет, разделен на прагматическую часть:

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

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

Другие вопросы по тегам