Насколько универсально поддерживается C99?
-
02-07-2019 - |
Вопрос
Насколько универсально стандарт 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)».