2008-09-26 7 views
44

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

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

+3

не забывайте о библиотеках. Помимо приятного синтаксиса (например, инициаторы инициализации), C99 добавляет множество полезных функций математической библиотеки, например long lrtint (double); который выполняет операцию быстрого округления, которую вы иначе должны взломать, как (длинный) (x + 0,5). – 2009-12-09 21:06:32

+0

Компилятор PGCC с высокой производительностью Portland Group совместим со 100% C99. – 2013-10-28 15:18:01

ответ

20

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

Компилятор Intel C имеет very good C99 support и производит быстрые двоичные файлы. (Спасибо 0x69!)

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

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

У Википедии есть nice summary of C99 support компиляторов.

+0

По ANSI C, вы имеете в виду C89/C90? Поскольку ANSI C и ISO C были синонимом, но я понимаю, что теперь ISO C относится к C99 – 2008-09-26 13:30:28

+7

GCC 4.5 окончательно перечисляет массивы переменной длины как * Done *, а не * Broken *! – u0b34a0f6ae 2010-06-23 12:14:40

7

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

+0

VLA полностью поддерживаются с gcc 4.5. – 2014-05-14 12:39:49

3

См. C99 suport status for GNU для получения подробных сведений о том, какие функции поддерживаются в настоящее время.

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

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

2

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

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

16

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

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

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

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

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

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

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

  • неоднозначные заявления и код
  • встроенные функции
  • _Pragma() - это делает прагмами гораздо более годные к употреблению
5

компилятор Си IBM имеет C99 зирр ort при вызове c99, но не при вызове cc или xlc.

3

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