Как применять объявления переменных в стиле C89 в gcc?

Я работаю над базой кода, которая в основном C с небольшим C ++, и в основном построена с помощью gcc, но иногда она должна быть построена с помощью MSVC. Компилятор Microsoft C по-прежнему в значительной степени является C89 с несколькими незначительными расширениями, и он по-прежнему не поддерживает смешанные определения кода и переменных à la C ++ / C99. Поэтому мне нужно найти способ, чтобы разработчики не записывали определения кода / переменных вне порядка, пока они работают с gcc, иначе assembly впоследствии прерывается с помощью MSVC. Если я использую gcc -std=c89 тогда все ломается, потому что комментарии в стиле C ++ недопустимы (могут быть и другие проблемы, но я не рассматривал это дальше). Если я использую gcc -std=gnu89 то допускаются определения кода / переменных вне порядка, так что это тоже не помогает. Есть идеи ? Думаю, мне просто нужно что-то вроде gcc -std=c99 -fno-inline-variable-definitions , если такой вариант существует.

Вы после -Wall -Wextra -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations и -Wdeclaration-after-statement options, как описано на странице предупреждений gcc-предупреждений . Обратите внимание, что это может вызвать много шума из-за проблем в файлах системных заголовков, и они являются только предупреждениями, поэтому у вас должна быть политика, которая бы заинтересована в создании нулевого предупреждения.

Я не верю, что есть способ сделать то, что вы хотите. Диалект C, поддерживаемый MSVC, ближе к C89, чем C99 (например, он не поддерживает назначенные инициализаторы); вы действительно хотите что-то более похожее на C89-with-C ++ – комментарий-и-inline-keyword.

Проблема в том , что комментарии C ++ могут влиять на правильность действительного кода C89. Например, значение этой строки существенно меняется:

 int a = 10//* foo */2; 

Я бы сказал, что лучше всего использовать C89 в ваших исходных файлах C, включая комментарии в стиле C89. inline , вероятно, хорошо, но: вы можете определить его для __inline на gcc.

Это не Win32, который делает код несовместимым, но компилятор. Вы можете использовать GCC на Win32 и получить большую межплатформенную совместимость.

Другая возможность – использовать компиляцию C ++ для вашей сборки Win32; компиляция GCC уже определила бы, что она действительно C, а компиляция C ++, как правило, также делает ее более сильной.

Другое решение – использовать сервер непрерывной интеграции, такой как CruiseControl, сконфигурированный таким образом, чтобы всякий раз, когда код регистрации кодов платформы GCC, CI-сервер может проверить его и построить с помощью VC ++ (или даже применить сторонний статический анализ инструмент) и по ошибке отправьте результаты по электронной почте пользователю, который проверял ошибочный код. Это решение может быть тяжелым для первоначальной проблемы, но может принести много других преимуществ.