Вопрос

Я привык к старому стилю C и только недавно начал изучать возможности c99.У меня только один вопрос:Будет ли моя программа успешно компилироваться, если я буду использовать в своей программе c99, флаг c99 с gcc и связать его с предыдущими библиотеками c99?

Итак, стоит ли мне придерживаться старого C89 или развиваться?

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

Решение

Я считаю, что в этом отношении они совместимы.Это при условии, что материал, который вы компилируете, не затрагивает какие-либо новые возможности.Например, если старый код содержит enum bool { false, true }; тогда у тебя проблемы.Как аналогичный динозавр, я медленно осваиваю чудесный новый мир C99.В конце концов, он скрывается там всего около 10 лет;)

Другие советы

Вам следует развиваться.Спасибо за внимание :-)

На самом деле, я подробнее об этом.

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

Я уже гарантирую, что мой новый код совместим с C1x — хотя я еще не использую какие-либо новые функции, я стараюсь убедиться, что он не сломается.

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

Фаза, на которой они сейчас находятся, дает им больше свободы в обновлении языка, но они по-прежнему следуют клятве Гиппократа с точки зрения результатов:«Прежде всего, не навреди».

Обычно, если ваш код не соответствует новому стандарту, компилятор вынужден вам об этом сообщить.Поэтому простая компиляция базы кода будет отличным началом.Однако, если вы прочтете Обоснование C99, вы увидите фразу «тихое изменение» — это то, на что вам нужно обратить внимание.

Это поведенческие изменения в компиляторе, о которых вам не нужно сообщать, и они могут стать источником сильного беспокойства и скрежета зубов, если ваше приложение начнет вести себя странно.Не беспокойтесь о битах «тихого изменения в c89» — если бы они были проблемой, вы бы уже были ими укушены.

Этот документ, кстати, отлично подходит для чтения, чтобы понять, почему в настоящем стандарте говорится то, что говорится.

С уважением: Попробуйте и узнайте. :-)

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

Если вы не нарушаете явные функции C99, код c90 будет нормально работать с флагом c99 с другими предыдущими библиотеками c99.

Но в C89 есть некоторые библиотеки на основе DOS, такие как ,, которые определенно не будут работать.

C99 очень гибок, поэтому не стесняйтесь переходить :-)

Соглашения о вызовах между библиотеками C не менялись уже много лет, и я даже не уверен, что они когда-либо менялись.

На этом этапе операционные системы в значительной степени полагаются на соглашения о вызовах C, поскольку API C, как правило, являются связующим звеном между частями ОС.

Итак, по сути, ответ: «Да, двоичные файлы будут обратно совместимы.Нет, естественно, код, использующий функции C99, не может быть позже скомпилирован компилятором, отличным от C99».

Он предназначен для обратной совместимости.Он формализует расширения, которые уже реализовали многие поставщики.Возможно, даже вероятно, что хорошо написанная программа не будет иметь никаких проблем при компиляции с C99.

По моему опыту, перекомпиляция некоторых модулей, а не других, чтобы сэкономить время...тратит много времени.Обычно есть какие-то детали, которые легко упустить из виду, и для обеспечения совместимости требуется новый компилятор.

Есть несколько частей стандарта C89, которые написаны неоднозначно, и в зависимости от того, как интерпретировать правило о типах указателей и объектах, к которым они обращаются, стандарт можно рассматривать как описание одного из двух очень разных языков - одного из которых семантически гораздо более мощный и, следовательно, пригодный для использования в более широком диапазоне областей, и один из которых предоставляет больше возможностей для оптимизации на основе компилятора.Стандарт C99 «уточнил» это правило, чтобы прояснить, что он не прилагает никаких усилий для обеспечения совместимости с предыдущим языком, даже несмотря на то, что во многих областях он пользуется подавляющим большинством;он также считает неопределёнными некоторые вещи, которые были определены в C89, но только потому, что правила C89 не были написаны достаточно точно, чтобы их запрещать (например,использование memcpy для каламбура типов в случаях, когда место назначения имеет длительность кучи).

Таким образом, C99 может быть совместим с языком, который, по мнению его авторов, был описан C89, но несовместим с языком, который обрабатывался большинством компиляторов C89 на протяжении 1990-х годов.

Некоторые функции C89 недействительны. C99.

Возможно, эти функции существуют только по историческим причинам и не должны использоваться в современном коде C89, но они существуют.

Стандартный проект C99 N1256 В пятом абзаце предисловия C99 сравнивается со старыми версиями и является хорошей отправной точкой для поиска этих несовместимостей, даже несмотря на то, что у него гораздо больше расширений, чем ограничений.

Неявный возврат int и типы переменных

Упоминается Лутцем в комментарии, напримерследующие действительны C89:

static i;
f() { return 1; }

а не C99, в котором надо писать:

static int i;
int f() { return 1; }

Это также исключает вызов функций без прототипов в C99: Требуются ли прототипы для всех функций в C89, C90 или C99?

n1256 говорит:

удалить неявный int

Возврат без выражения для непустой функции

Действительный C89, недействительный C99:

int f() { return; }

Я думаю, что в C89 он возвращает значение, определенное реализацией.n1256 говорит:

возврат без выражения не разрешен в функции, возвращающей значение

Целочисленное деление с отрицательным операндом

  • С89:округляется до направления, определенного реализацией
  • С99:округляет до 0

Итак, если ваш компилятор округлит до -inf, и вы полагались на поведение, определенное реализацией, ваш компилятор теперь вынужден ломать ваш код на C99.

https://stackoverflow.com/a/3604984/895245

n1256 говорит:

надежное целочисленное деление

Совместимость с Windows

Одной из основных практических проблем является возможность компиляции в Windows, поскольку Microsoft не намерен полностью внедрять C99 слишком скоро.

Вот, например, почему libgit2 ограничения разрешенных функций C99.

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