Как применять объявления переменных в стиле C89 в gcc? - PullRequest
11 голосов
/ 23 июня 2010

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

Ответы [ 3 ]

13 голосов
/ 23 июня 2010

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

3 голосов
/ 23 июня 2010

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

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

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

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

1 голос
/ 23 июня 2010

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

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

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

...