Я обычно пишу код C в C89, теперь некоторые функции C99 (как intxx_t
или __VA_ARGS__
или snprintf
) очень полезны, и может быть даже жизненно важным.
Прежде чем я больше моих требований от C89 до C99, который я хотел знать, какая из функций C99 широко поддерживалась и которые широко не поддерживали или даже считали вредные.
Я знаю, что мы могли просто проверить нашу целевую поддержку компилятора, но это сузит нашу поддержку много, и как это для программного обеспечения с открытым исходным кодом, я предпочел бы иметь более широкую поддержку.
Например, мы используем Солярис (suncc) компилятор и gcc, но мог бы быть другой компилятор, который мы переместим из пути, в то время как мы могли сохранить совместимость с очень небольшими усилиями.
Например, я никогда не работал над Windows, ни я знаю что-либо о компиляторах Windows, но было бы хорошо сохранить совместимость Windows.
Некоторые функции C99 являются необязательными, поэтому их отсутствие не является технически несоответствующим. Я не буду различать ниже.
Хм, win не имеет
, хотя есть версия stdint.h с открытым исходным кодом для Microsoft . Даже когда файл реализован, многие отдельные типы отсутствуют.
Сложная и воображаемая поддержка часто отсутствует или не работает.
Расширенные идентификаторы и широкие символы могут быть проблемными точками.
goto
по-прежнему считается вредным .
Каким-то образом я собрал четыре голосов против. Я представил заявление выше, чтобы добавить легкомыслия, и серьезно отношусь к концепции, стоящей за ним, только на 30%.
Я ожидаю, что голоса против будут от молодых людей, которые не понимают истории языков программирования. Не каждый отдельный goto
является злом, но - по сравнению со 100% чистым кодом спагетти, над которым я работал (миллионы строк FORTRAN 66) - разумно и продуктивно заменить столько операторы goto
со структурированными операторами ( для
, , а
, делайте .. пока
, переключают
) насколько это возможно. Но иногда goto
просто прекрасен, если он избегает сложности, такой как дополнительные флаговые переменные для выхода из нескольких вложенных циклов.
Что ж, 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 ++ победит.
Типовые математические функции из
не обязательно широко используются, хотя они, похоже, предоставляются с GCC 4.2.1 в MacOS X 10.6. 2.
Ограничение
стало ключевое слово в C99. Это реализация посягательна на пространстве имен пользователей. Если у вас есть действующая программа C89, которая содержит слово ограничить
, вы должны изменить свою программу, чтобы она работала с C99. Другими словами: не обратная совместимость. Если бы они собирались нарушить обратную совместимость, они должны были удалить , получает
из стандарта сначала.
Runtime sizeof - кошмар для авторов компилятора. Так что считаю вредным.