Насколько универсально поддерживается C99? - PullRequest
44 голосов
/ 26 сентября 2008

Насколько универсально стандарт C99 поддерживается в современных компиляторах? Я понимаю, что даже GCC полностью не поддерживает это. Это правильно?

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

Ответы [ 7 ]

22 голосов
/ 26 сентября 2008

Если вы хотите написать переносимый код на C, то я бы посоветовал вам писать на C89 (старый стандарт ANSI C). Этот стандарт поддерживается большинством компиляторов.

Компилятор Intel C имеет очень хорошую поддержку C99 и производит быстрые двоичные файлы. (Спасибо 0x69 !)

MSVC поддерживает некоторые новые функции и Microsoft планирует расширить поддержку в будущих версиях.

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

В Википедии, похоже, есть хорошее резюме поддержки C99 компиляторов.

16 голосов
/ 26 сентября 2008

Кто-то упомянул, что у компилятора Intel есть поддержка C99. Существует также Comeau C / C ++ компилятор , который полностью поддерживает C99. Это единственные, о которых я знаю.

Функции C99, которые я не использую, потому что они плохо поддерживаются, включают:

  • массивы переменной длины
  • макросы с переменным количеством параметров.

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

  • stdint.h
  • snprintf() - MS имеет нестандартный _snprintf(), который имеет серьезные ограничения, заключающиеся в том, что буфер не всегда завершается нулем и не указывает, насколько большим должен быть буфер

Чтобы обойти проблемы поддержки Microsoft, я использую публичный домен stdint.h от MinGW (который я изменил, чтобы он также работал на VC6) и почти публичный домен snprintf() от Holger Вайс

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

  • смешанные декларации и код
  • встроенные функции
  • _Pragma() - это делает прагмы более полезными
7 голосов
/ 26 сентября 2008

Для gcc существует таблица со всеми поддерживаемыми функциями . Кажется, что самое большое, чего не хватает - это массивы переменной длины. Большинство других отсутствующих функций - это проблемы с библиотекой, а не языковые функции.

5 голосов
/ 11 августа 2009

Компилятор IBM c поддерживает c99 при вызове как c99, но не при вызове cc или xlc.

3 голосов
/ 17 января 2011

Clang (компилятор C и C ++ на основе LLVM) имеет довольно хорошую поддержку C99. Я думаю, что единственное, что он не поддерживает, - это прагмы с плавающей запятой.

3 голосов
/ 26 сентября 2008

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

Sun Studio подразумевает поддержку всей спецификации C99. Я никогда не использовал их, поэтому не могу подтвердить.

Я не верю, что компилятор Microsoft полностью поддерживает спецификацию C99. На данный момент они гораздо больше ориентированы на C ++

2 голосов
/ 26 сентября 2008

Microsoft, похоже, отслеживает стандарты C ++, но не поддерживает C99. (Они могут выбирать некоторые функции, но можно сказать, что это C ++ 0x, где есть совпадение.)

Начиная с Visual Studio .NET 2003, в новых проектах по умолчанию включена опция «Компилировать код C как C ++ (/ TP)».

...