Comment appliquer des déclarations de variables de style C89 dans gcc?

Je travaille sur une base de code principalement composée de C avec un peu de C ++ et construite principalement avec gcc, mais elle doit parfois être construite avec MSVC. Le compilateur C de Microsoft est toujours à peu près C89 avec quelques extensions mineures et ne prend toujours pas en charge le code mixte et les définitions de variables à la C ++ / C99. Il faut donc que je trouve un moyen d’empêcher les développeurs d’écrire des définitions de code / variable dans le désordre lorsqu’ils travaillent avec gcc, sinon la construction rompt par la suite avec MSVC. Si j’utilise gcc -std=c89 tout se brise, car les commentaires de style C ++ ne sont pas autorisés (il peut aussi y avoir d’autres problèmes, mais je n’ai pas encore étudié la question). Si j’utilise gcc -std=gnu89 les définitions de code / variable en panne sont autorisées, ce qui ne m’aide pas non plus. Des idées ? Je suppose que j’ai juste besoin de quelque chose comme gcc -std=c99 -fno-inline-variable-definitions , si une telle option existait.

Vous recherchez les -Wextra -Wssortingct-prototypes -Wextra -Wssortingct-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations et -Wdeclaration-after-statement , comme -Wdeclaration-after-statement sur la page d’informations sur les avertissements gcc . Notez que cela peut causer beaucoup de bruit en raison de problèmes dans les fichiers d’en-tête du système. Ce ne sont que des avertissements. Vous devez donc avoir pour politique de vouloir une version zéro avertissement.

Je ne crois pas qu’il existe un moyen de faire ce que vous voulez. Le dialecte de C pris en charge par MSVC est plus proche de C89 que de C99 (par exemple, il ne prend pas non plus en charge les initialiseurs désignés); vous voulez vraiment quelque chose de plus semblable à C89-with-C ++ – comments-and-inline-keyword.

Le problème avec cela est que les commentaires C ++ peuvent affecter l’exactitude du code C89 valide. Par exemple, la signification de cette ligne change considérablement:

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

Je dirais que votre meilleur pari est d’appliquer C89 dans vos fichiers source C, y compris les commentaires de style C89. inline est probablement OK, cependant: vous pouvez le définir à __inline sur gcc.

Ce n’est pas Win32 qui rend le code non compilable, mais le compilateur. Vous pouvez utiliser GCC sur Win32 et obtenir une meilleure compatibilité entre plates-formes.

Une autre possibilité consiste à utiliser la compilation C ++ pour votre build Win32; la compilation GCC aura déjà déterminé qu’il s’agit d’un C valide, et la compilation C ++ le rendra également plus fort.

[edit] Une autre solution consiste à utiliser un serveur d’continuous integration tel que CruiseControl configuré pour que, chaque fois que le code d’enregistrement des codeurs de la plate-forme GCC, le serveur CI puisse l’extraire et le construire à l’aide de VC ++ (ou même appliquer une parsing statique tierce outil) et, en cas d’erreur, envoyez les résultats par courrier électronique à l’utilisateur qui a archivé le code erroné. Cette solution peut être lourde pour le problème initial, mais peut également apporter de nombreux autres avantages.