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