ANSI C по сравнению с другими стандартами C

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

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

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

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

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

int i;

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

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

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

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

Ответ 1

Я не понимаю, почему/если я должен выберите стандарт 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 НЕЗАВИСИМО от того, какой стандарт я компилирую с?

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

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

Ответ 2

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

C99 является пересмотром стандарта C; он был разработан комитетом ISO C и стандартизован как ISO, так и ANSI. Оба C89 и C99 являются стандартами ANSI. В общем выражении фраза "ANSI C" обычно относится к C89; K & R 2nd ed. только для книг C89, а не C99.

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

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

Ответ 3

У меня нет четкого объяснения для стандартов C.

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

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

C99 действителен:

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

C89, ANSI и старше:

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

Ответ 4

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

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

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

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