Вопрос

На нескольких компиляторах я использовал (все gcc но различные версии) я получаю C99 mode Ошибка для таких вещей, как объявление int i внутри выражения для петли, а не до него (если я не использую 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 доступно только для цикла для цикла НЕСМОТРЯ НИ НА ЧТО Из какого стандарта я скомпилируюсь? Еще один способ задавать этот же вопрос, если я компилируюсь с c89 Стандарт будет i обоих для циклов доступны для всей функции, и если я составляю с c99 Стандарт будет i первого для петли быть доступным для всей функции, пока i Из второго для цикла будет доступна только для цикла?

Это было полезно?

Решение

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

Пара причин:

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

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

Это безопасно, чтобы сказать, что ISO будет обновлять свой стандарт для C, но оригинальный стандарт ANSI для C всегда будет таким же?

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

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

Вы не можете написать это второй путь в C89 (т.е. с -pedantic Придерживаться стандарта), так что нет «независимо от того, какой стандарт». Версии C с расширениями GNU не являются стандартами, они «диалекты» (по крайней мере, это то, что называет их страницы человека). В 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-й ред. Книга охватывает только C89, а не C99.

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

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

У меня нет неизвестности к стандартам C.

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

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

C99 Действительно:

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

C89, ANSI и старше:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top