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
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.
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.
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
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. –
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.
'gcc -std = c89' ** N'autorise PAS ** les commentaires de style C++, donc ce n'est pas une solution réalisable. –
@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
@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++. –
- 1. C89 compilateur GCC c99
- 2. obtention de déclarations de variables
- 3. Affirmations dans C89?
- 4. Formulaire Struts et déclarations variables
- 5. les options de gcc
- 6. Bénéfice de performance des déclarations de variables dans VBA?
- 7. Meilleure façon de transmettre les structures typedef'd déclarer dans C89?
- 8. Comment appliquer l'option gcc -fvisibility aux symboles dans les bibliothèques statiques?
- 9. compiler avec c89 et c99 gcc 4.4.2 par défaut à c99?
- 10. Utilisation de ANTLR pour identifier les déclarations de variables globales dans un fichier JavaScript
- 11. Expression régulière pour correspondre aux déclarations de variables T-SQL
- 12. C89: Besoin de déclarer des fonctions avant de les référencer?
- 13. je n'obtenir ce que les déclarations de variables de pointeur suivantes signifient dans c
- 14. C89: Des erreurs débutant dans ce code?
- 15. Visual Studio Debugger ne pas entrer dans les déclarations de variables inutilisées
- 16. Les déclarations de ligne MySQL?
- 17. Comment nettoyer les déclarations de vars combinées dans Eclipse?
- 18. Comment vérifier les limites dans gcc/mingw?
- 19. Comment gérer les avertissements -Wconversion de GCC?
- 20. comment appliquer les paramètres dans cette procédure?
- 21. Java si les déclarations
- 22. Déclarations de commutation séparées multiples
- 23. C++: Déclarations de variables de fonction, comment ça fonctionne en interne?
- 24. caractéristiques Scala: nid dans les déclarations
- 25. omettant « def » dans les déclarations Groovy
- 26. Création d'une boucle dans R pour appliquer les mêmes fonctions à plusieurs variables de même nom
- 27. Comment utiliser les déclarations (type, inline, optimize) dans Scheme?
- 28. multiples déclarations et définitions
- 29. RankNTypes pour les déclarations d'instance?
- 30. Déclarations de type dans Fortran
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. –
Vous pouvez faire '-Wdeclaration-after-statement -Werror = déclaration-after-statement' pour le transformer en erreur. –
@Matthew: Maintenant, c'est un extrait que je ne connaissais pas. –