MinGW компилятор для Windows, с использованием GCC, C99 против GNU99

Я использую компилятор MinGW для Windows. Я делаю некоторые программы на C. Большинство статей, которые я прочитал об этом, похоже, устарели … в последний раз, когда я читал, C99 был неполным в GCC, это все еще верно? Мой реальный вопрос заключается в кросс-платформенной совместимости между настройками C99 и GNU99 … следует ли мне избегать использования настроек GNU99 и их расширений и просто придерживаться C99? Я новичок в этом наборе MinGW-компиляторов, так как я всегда использовал Visual Studio и решил попробовать что-то новое … сейчас я компилирую с этими настройками …

-march=native -O3 -std=gnu99

Есть ли какие-либо рекомендуемые команды компилятора, которые я должен ввести для создания программ на C, а также для создания программ на C ++ с этим компилятором?

Я хочу сделать простую программу, совместимую с Windows, Mac, & Linux, но в первую очередь Windows.

3

Решение

Что касается 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]
1

Другие решения

Если вы хотите что-то, что компилируется с «любым» компилятором, вам следует избегать gnu99 настройки и использовать c89, c99 или же c11— и для использования C ++ c++03 или же c++11 (или же c++0x в зависимости от конкретной версии компилятора). Чем позже вы пойдете на эти вещи, тем больше вы ограничитесь «новыми версиями компиляторов».

gnu99 означает C99 с «расширениями GNU», что означает, что код, который компилируется с этим параметром, может не компилироваться на других компиляторах.

Вы обязательно должны также подать заявку -Wallи мне нравится иметь -Wextra -Werror тоже. -Wall означает включить (почти) все предупреждения, -Wextra означает включить дополнительные предупреждения, кроме тех, что в -Wall, а также -Werror означает, что вы ДОЛЖНЫ исправить любые предупреждения до того, как получите какой-либо код («обрабатывать предупреждения как ошибки»).

3

Большая часть функции C99 была поддержана gcc, подробнее см. Состояние функций C99 в GCC.

Некоторые расширения GNU удобны в использовании. Выбор между C99 и GNU99 зависит от того, собираетесь ли вы использовать другие компиляторы. Но если вы думаете о Visual Studio, он не поддерживает C99, поэтому лучше придерживаться C89, если вы позже вернетесь в Visual Studio.

1