Какие функции C99 считают вредными или неподдерживаемыми [закрытый]

Я обычно пишу код C в C89, теперь некоторые функции C99 (как intxx_t или __VA_ARGS__ или snprintf) очень полезны, и может быть даже жизненно важным.

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

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

Например, мы используем Солярис (suncc) компилятор и gcc, но мог бы быть другой компилятор, который мы переместим из пути, в то время как мы могли сохранить совместимость с очень небольшими усилиями.

Например, я никогда не работал над Windows, ни я знаю что-либо о компиляторах Windows, но было бы хорошо сохранить совместимость Windows.

18
задан 14 December 2009 в 04:17
поделиться

6 ответов

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

  • Хм, win не имеет , хотя есть версия stdint.h с открытым исходным кодом для Microsoft . Даже когда файл реализован, многие отдельные типы отсутствуют.

  • Сложная и воображаемая поддержка часто отсутствует или не работает.

  • Расширенные идентификаторы и широкие символы могут быть проблемными точками.

См. этот список проблем с функциями C99 в gcc.

4
ответ дан 30 November 2019 в 08:27
поделиться

goto по-прежнему считается вредным .


Каким-то образом я собрал четыре голосов против. Я представил заявление выше, чтобы добавить легкомыслия, и серьезно отношусь к концепции, стоящей за ним, только на 30%.

Я ожидаю, что голоса против будут от молодых людей, которые не понимают истории языков программирования. Не каждый отдельный goto является злом, но - по сравнению со 100% чистым кодом спагетти, над которым я работал (миллионы строк FORTRAN 66) - разумно и продуктивно заменить столько операторы goto со структурированными операторами ( для , , а , делайте .. пока , переключают ) насколько это возможно. Но иногда goto просто прекрасен, если он избегает сложности, такой как дополнительные флаговые переменные для выхода из нескольких вложенных циклов.

9
ответ дан 30 November 2019 в 08:27
поделиться

Что ж, gcc по сути будет gcc независимо от того, на какую настольную ОС вы нацеливаетесь.

Visual C ++, будучи в первую очередь компилятором C ++, не так озабочен C99 спец. stdint.h объявляет ваши любимые макросы intxx_t. __ VA_ARGS __ есть в наличии. _Bool, _Complex и _Pragma не реализованы в компиляторе Microsoft Visual C ++. Я почти уверен, что поля в printf / scanf не были реализованы, хотя, возможно, VC2010 обрабатывает их. snprintf присутствует, но имеет ведущее подчеркивание и немного другую семантику.

Краткий ответ: «Чем проще» реализовать функцию C99 без изменения грамматики компилятора или замены стандартной библиотеки, тем более вероятно, что VC ++ будет ее поддерживать. Если есть конфликт между C99 и C ++, ожидайте, что C ++ победит.

5
ответ дан 30 November 2019 в 08:27
поделиться

Типовые математические функции из не обязательно широко используются, хотя они, похоже, предоставляются с GCC 4.2.1 в MacOS X 10.6. 2.

0
ответ дан 30 November 2019 в 08:27
поделиться

Ограничение стало ключевое слово в C99. Это реализация посягательна на пространстве имен пользователей. Если у вас есть действующая программа C89, которая содержит слово ограничить , вы должны изменить свою программу, чтобы она работала с C99. Другими словами: не обратная совместимость. Если бы они собирались нарушить обратную совместимость, они должны были удалить , получает из стандарта сначала.

2
ответ дан 30 November 2019 в 08:27
поделиться

Runtime sizeof - кошмар для авторов компилятора. Так что считаю вредным.

3
ответ дан 30 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: