2010-06-23 4 views
11

Je travaille sur une base de code qui est la plupart du temps C avec un peu de C++, et est principalement construite avec gcc mais parfois elle doit être construite avec MSVC. Le compilateur C de Microsoft est encore à peu près C89 avec quelques extensions mineures, et il ne supporte toujours pas les définitions mixtes de code et de variable à la C++/C99. J'ai donc besoin de trouver un moyen d'empêcher les développeurs d'écrire des définitions de code/variable en désordre pendant qu'ils travaillent avec gcc, sinon la construction rompt avec MSVC. Si j'utilise gcc -std=c89 alors tout se casse parce que les commentaires de style C++ ne sont pas autorisés (il y a peut-être aussi d'autres problèmes, mais je n'ai pas cherché plus loin). Si j'utilise gcc -std=gnu89 alors les définitions de code/variable désordonnées 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.Comment appliquer les déclarations de variables C89 dans gcc?

Répondre

13

Vous êtes après les -Wall-Wextra-Wstrict-prototypes-Wold-style-definition-Wmissing-prototypes-Wmissing-declarations et -Wdeclaration-after-statement des options, comme décrit sur le gcc warnings info page. Notez que ceux-ci peuvent causer beaucoup de bruit à cause de problèmes dans les fichiers d'en-tête du système, et ils ne sont que des avertissements. Vous devez donc avoir une politique de mise en place d'une génération d'avertissement zéro.

+0

Merci - Je n'avais pas repéré '-Wdeclaration-after-statement' - qui devrait aider un peu - maintenant tout ce que j'ai à faire est de m'assurer que les développeurs corrigent tous leurs avertissements. –

+10

Vous pouvez faire '-Wdeclaration-after-statement -Werror = déclaration-after-statement' pour le transformer en erreur. –

+0

@Matthew: Maintenant, c'est un extrait que je ne connaissais pas. –

3

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

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

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

Je dirais que le mieux 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.

+0

L'autre réponse fonctionne, mais je pense que c'est probablement trop fastidieux. J'aime mieux cette réponse. N'utilisez pas de commentaires de style C++. – Omnifarious

+0

Malheureusement c'est une base de code importante avec beaucoup de développeurs - faire une recherche de masse et remplacer sur les commentaires serait un effort important (surtout tous les problèmes de contrôle de source qui en résulteraient) et les développeurs se révolteraient probablement forcé d'utiliser des commentaires C de style ancien. Il pourrait également y avoir d'autres restrictions C89 que nous ne pourrions pas contourner. Nous avons * vraiment * besoin de GNU89 ou C99, mais sans les déclarations de variables de style C++ qui causent MSVC à barf. –

1

Ce n'est pas Win32 qui rend le code incompilable, mais le compilateur. Vous pouvez utiliser GCC on Win32 et bénéficier d'une compatibilité multiplateforme plus importante.

Une autre possibilité consiste à utiliser la compilation C++ pour votre version Win32; la compilation GCC aura déjà déterminé que C est valide, et la compilation C++ le rendra généralement plus fort.

[modifier] Une autre solution consiste à utiliser un serveur d'intégration continue tel que CruiseControl configuré de telle sorte que chaque fois que les codeurs de la plate-forme GCC code d'enregistrement, le serveur CI peut le vérifier et de le construire en utilisant VC++ (ou même appliquer une outil d'analyse statique tiers) et en cas d'erreur, envoyez les résultats par e-mail à l'utilisateur qui a enregistré le code erroné. Cette solution peut être lourde pour le problème original, mais peut donner beaucoup d'autres avantages.

+0

'gcc -std = c89' ** N'autorise PAS ** les commentaires de style C++, donc ce n'est pas une solution réalisable. –

+0

@Paul R: Paul Désolé, j'ai supprimé cette déclaration avant de poster le commentaire (et après avoir lu votre message plus attentivement). – Clifford

+0

@Clifford - pas de problème - downvote supprimé. La compilation C++ n'est probablement pas une option cependant - nous aurions besoin de faire beaucoup de changements à la base de code, par exemple. lancer le résultat des appels à malloc et traiter de nombreuses autres différences subtiles entre C et C++. –

Questions connexes