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

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

Ответ 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С++ (или даже применить сторонний инструмент статического анализа), а также отправить сообщение об ошибках пользователю, который проверял ошибочный код. Это решение может быть тяжелым для первоначальной проблемы, но может принести много других преимуществ, кроме того.