Насколько универсально поддерживается C99?
Насколько универсален стандарт C99, поддерживаемый в современных компиляторах? Я понимаю, что даже GCC полностью его поддерживает. Правильно ли это?
Какие функции C99 поддерживаются больше, чем другие, т.е. что я могу использовать, чтобы быть уверенным, что большинство компиляторов поймут меня?
Ответы
Ответ 1
Если вы хотите написать переносимый C-код, я предлагаю вам написать на C89 (старый стандарт ANSI C). Этот стандарт поддерживается большинством компиляторов.
У компилятора Intel C очень хорошая поддержка C99, и он создает быстрые двоичные файлы. (Спасибо 0x69!)
MSVC поддерживает некоторые новые функции, и Microsoft планирует расширить поддержку в будущих версиях.
GCC поддерживает некоторые новые вещи C99. Они создали таблицу о статусе функций C99. Вероятно, наиболее пригодной функцией C99 является массив переменной длины, и GCC поддерживает его сейчас. Clang (LLVM C фронт) поддерживает большинство функций, кроме плагинов с плавающей запятой.
В Википедии есть хорошая сводка поддержки C99 компиляторов.
Ответ 2
Кто-то упомянул, что компилятор Intel поддерживает C99. Существует также Comau C/С++ компилятор, который полностью поддерживает C99. Это единственные, о которых я знаю.
Функции C99, которые я не использую, потому что они плохо поддерживаются, включают:
- массивы переменной длины
- с переменным числом параметров.
Функции C99, которые я регулярно использую, выглядят довольно хорошо (кроме Microsoft):
-
stdint.h
-
snprintf()
- MS имеет нестандартный _snprintf()
, который имеет серьезные ограничения не всегда нулевого завершения буфера и не указывает, насколько большой буфер должен быть
Чтобы обойти поддержку Microsoft без поддержки, я использую общедоступный домен stdint.h
из MinGW (который я модифицировал, чтобы также работать на VC6 ) и почти общедоступный домен snprintf()
от Holger Weiss
Элементы, которые не поддерживаются Microsoft, но будут по-прежнему использоваться для других компиляторов в зависимости от проекта:
- смешанные декларации и код
- встроенные функции
-
_Pragma()
- это делает прагмы гораздо более полезными
Ответ 3
Для gcc существует таблица со всеми поддерживаемыми функциями. Кажется, что самое большое недостающее - массивы переменной длины. Большинство других недостающих функций - проблемы с библиотекой, а не языковые функции.
Ответ 4
Компилятор IBM c поддерживает c99 при вызове c99, но не при вызове cc или xlc.
Ответ 5
Посмотрите статус C99 для GNU, чтобы узнать, какие функции поддерживаются в настоящее время.
Sun Studio подразумевается для поддержки всей спецификации C99. Я никогда их не использовал, поэтому не могу подтвердить.
Я не считаю, что компилятор microsoft полностью поддерживает спецификацию C99. В настоящее время они гораздо более сосредоточены на С++.
Ответ 6
Clang (компилятор C и С++ на основе LLVM) имеет довольно хорошую поддержку C99. Я думаю, что единственное, что он не поддерживает, - это прагмы с плавающей запятой.
Ответ 7
Microsoft, похоже, отслеживает стандарты С++, но не поддерживает C99. (Они могут вишневидно выбрать некоторые функции, но можно сказать, что они выбрали вишневый С++ 0x, где есть перекрытие.)
Как и в Visual Studio.NET 2003, в новых проектах по умолчанию включен параметр "Компилировать C-код как опция С++ (/TP)".