Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

Чтобы обойти отсутствие поддержки со стороны Microsoft, я использую всеобщее достояние stdint.h из МинГВ (который я модифицировал, чтобы он работал и на VC6) и почти общественное достояние snprintf() от Хольгера Вайса

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top