Я использую компилятор MinGW для Windows. Я делаю некоторые программы на C. Большинство статей, которые я прочитал об этом, похоже, устарели … в последний раз, когда я читал, C99 был неполным в GCC, это все еще верно? Мой реальный вопрос заключается в кросс-платформенной совместимости между настройками C99 и GNU99 … следует ли мне избегать использования настроек GNU99 и их расширений и просто придерживаться C99? Я новичок в этом наборе MinGW-компиляторов, так как я всегда использовал Visual Studio и решил попробовать что-то новое … сейчас я компилирую с этими настройками …
-march=native -O3 -std=gnu99
Есть ли какие-либо рекомендуемые команды компилятора, которые я должен ввести для создания программ на C, а также для создания программ на C ++ с этим компилятором?
Я хочу сделать простую программу, совместимую с Windows, Mac, & Linux, но в первую очередь Windows.
Что касается C, Visual Studio
до не давнего времени не поддерживал С99 вообще.
Что касается gcc
вы можете найти подробный подробная рецензия по какому стандарту они поддерживают и укромные уголки. У них также есть хороший список расширений они поддерживают. Вы должны быть немного осторожны с gcc
и расширения, потому что просто указать, какой стандарт вы хотите использовать, недостаточно для создания предупреждения или ошибки при использовании расширения. Например, вы можете быть удивлены, что используя:
gcc -std=c90 -W -Wall
позволяет использовать массивы переменной длины без предупреждения. Чтобы сгенерировать предупреждение, нужно добавить -pedantic
:
gcc -std=c90 -W -Wall -pedantic
и тогда это сгенерирует предупреждение, подобное этому:
warning: ISO C90 forbids variable length array ‘array’ [-Wvla]
Если вы хотите что-то, что компилируется с «любым» компилятором, вам следует избегать gnu99
настройки и использовать c89
, c99
или же c11
— и для использования C ++ c++03
или же c++11
(или же c++0x
в зависимости от конкретной версии компилятора). Чем позже вы пойдете на эти вещи, тем больше вы ограничитесь «новыми версиями компиляторов».
gnu99
означает C99 с «расширениями GNU», что означает, что код, который компилируется с этим параметром, может не компилироваться на других компиляторах.
Вы обязательно должны также подать заявку -Wall
и мне нравится иметь -Wextra -Werror
тоже. -Wall
означает включить (почти) все предупреждения, -Wextra
означает включить дополнительные предупреждения, кроме тех, что в -Wall
, а также -Werror
означает, что вы ДОЛЖНЫ исправить любые предупреждения до того, как получите какой-либо код («обрабатывать предупреждения как ошибки»).
Большая часть функции C99 была поддержана gcc, подробнее см. Состояние функций C99 в GCC.
Некоторые расширения GNU удобны в использовании. Выбор между C99 и GNU99 зависит от того, собираетесь ли вы использовать другие компиляторы. Но если вы думаете о Visual Studio, он не поддерживает C99, поэтому лучше придерживаться C89, если вы позже вернетесь в Visual Studio.