Как осуществить объявления переменной C89-стиля в gcc?

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

11
задан Kate Gregory 23 June 2010 в 13:54
поделиться

3 ответа

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

13
ответ дан 3 December 2019 в 07:10
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 07:10
поделиться

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

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

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

1
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: