Подтвердить что ты не робот

Насколько универсально поддерживается C99?

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

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

4b9b3361

Ответ 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)".