Как обеспечить соблюдение переменных в стиле C89 в GCC?

StackOverflow https://stackoverflow.com/questions/3099813

  •  29-09-2019
  •  | 
  •  

Вопрос

Я работаю над базой кода, которая в основном C с небольшим количеством C ++, и в основном построена GCC, но иногда его необходимо построить с помощью MSVC. Compiler M Microsoft C Compiler по-прежнему в значительной степени C89 с несколькими незначительными расширениями, и он все еще не поддерживает смешанные кодовые и переменные определения à la C ++ / C99. Поэтому мне нужно найти способ предотвратить разработчики от записи кода / переменной кода / переменной, в то время как они работают с GCC, в противном случае построение впоследствии разрывается с 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 варианты, как описано в информация о предупреждении GCC. Анкет Обратите внимание, что это может вызвать большой шум от проблем в файлах заголовков системы, и это только предупреждения, так что у вас должна быть политика, чтобы быть заинтересованным в сборе с нулевым накоплением.

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top