Я работаю над базой кода, которая в основном C с небольшим С++, и в основном построена с использованием gcc, но иногда она должна быть построена с помощью MSVC. Компилятор Microsoft C по-прежнему довольно много C89 с несколькими небольшими расширениями, и он по-прежнему не поддерживает смешанные определения кода и переменных à la С++/C99. Поэтому мне нужно найти способ, чтобы разработчики не записывали определения кода/переменных вне порядка, пока они работают с gcc, иначе сборка впоследствии прерывается с помощью MSVC. Если я использую gcc -std=c89
, тогда все ломается, потому что комментарии в стиле С++ недопустимы (могут быть и другие проблемы, но я не рассматривал это дальше). Если я использую gcc -std=gnu89
, то допускаются определения кода/переменных вне порядка, так что это тоже мне не помогает. Есть идеи? Думаю, мне просто нужно что-то вроде gcc -std=c99 -fno-inline-variable-definitions
, если бы такой вариант существовал.
Как применять объявления переменных в стиле C89 в gcc?
Ответ 1
После параметров -Wall
-Wextra
-Wstrict-prototypes
-Wold-style-definition
-Wmissing-prototypes
-Wmissing-declarations
и -Wdeclaration-after-statement
, как описано в информация о предупреждениях gcc. Обратите внимание, что это может вызвать много шума из-за проблем в системных заголовочных файлах, и они являются только предупреждениями, поэтому у вас должна быть политика, требующая создания нулевого предупреждения.
Ответ 2
Я не верю, что есть способ сделать то, что вы хотите. Диалект C, поддерживаемый MSVC, ближе к C89, чем C99 (например, он не поддерживает назначенные инициализаторы); вы действительно хотите что-то более похожее на C89-with-С++ - комментарий-и-inline-keyword.
Проблема заключается в том, что комментарии С++ могут влиять на правильность действительного кода C89. Например, значение этой строки существенно меняется:
int a = 10//* foo */2;
Я бы сказал, что лучше всего использовать C89 в исходных файлах C, включая комментарии в стиле C89. inline
, вероятно, ОК, однако: вы можете определить его на __inline
на gcc.
Ответ 3
Это не Win32, который делает код несовместимым, но компилятор. Вы можете использовать GCC на Win32 и получить большую межплатформенную совместимость.
Другая возможность - использовать компиляцию С++ для вашей сборки Win32; компиляция GCC уже определила бы, что она действительна C, а компиляция С++, как правило, также делает ее более сильной.
[править] Другим решением является использование сервера непрерывной интеграции, такого как CruiseControl, настроенного таким образом, чтобы всякий раз, когда код регистрации кодов платформы GCC, сервер CI может проверить его и построить с помощью VС++ (или даже применить сторонний инструмент статического анализа), а также отправить сообщение об ошибках пользователю, который проверял ошибочный код. Это решение может быть тяжелым для первоначальной проблемы, но может принести много других преимуществ, кроме того.