Je travaille sur une base de code qui est principalement C avec un peu C ++ et est principalement construite avec GCC, mais il doit parfois être construit avec MSVC. Le compilateur C Microsoft est toujours à peu près C89 avec quelques extensions mineures, et elle ne prend toujours pas en charge les définitions de code mixte et de variables à la em> c ++ / c99. Donc, j'ai besoin de trouver un moyen d'empêcher les développeurs d'écrire des définitions de code / de variable hors commandement lorsqu'ils travaillent avec GCC, sinon la construction se brise ensuite avec MSVC. Si j'utilise gcc -std = C89 code>, tout ce qui se casse parce que c ++ - style de style ne sont pas autorisés (il peut y avoir d'autres problèmes aussi, mais je n'ai pas encore examiné cela). Si j'utilise
gcc -std = gnu89 code>, les définitions de code de sortie / variable sont autorisées, de sorte que cela 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-définitions code>, si une telle option existait. P>
3 Réponses :
Vous avez une fois le -wall code>
-wextra code>
-wstrict-prototypes code>
-Le-style-définition de style code>
-wmissing-prototypes code>
-WMISSING-DÉCLARATIONS CODE> et
-WDECLARATION-After-ÉLIMINATION CODE> Options, comme décrit sur le Page d'avertissement de GCC Page . Notez que celles-ci peuvent causer beaucoup de bruit à partir de problèmes dans les fichiers d'en-tête du système, et ce ne sont que des avertissements, vous devez donc avoir une politique d'avoir une construite à zéro-avertissement. P>
Merci - je n'avais pas tacheté -wdeclaration-après-déclaration code> - qui devrait aider un peu - maintenant tout ce que je dois faire est de vous assurer que les développeurs résolvent tous leurs avertissements.
Vous pouvez faire -wdeClaration-après-déclaration -werror = déclaration après l'instruction code> pour la transformer en une erreur.
@Matthew: Maintenant c'est un extrait que je ne connaissais pas.
@Matthew: Ce serait une solution parfaite, mais cela ne semble pas fonctionner avec GCC 4.0 ou 4.2.
@Paul, oui qui semble être bug 35058 . Il dit qu'il a été corrigé dans GCC 4.4, ce que j'utilise. Je suppose que jusqu'à ce que vous puissiez mettre à niveau vous pouvez tuer la construction en greffing pour cet avertissement.
@Matthew: Merci - il ressemble à GCC 4.2 accepte -werror = xxx mais le traite de la même manière que -wxxx, mais GCC 4.0 Just Soumpes. Quoi qu'il en soit, Grepping pour les avertissements me donne au moins quelque chose d'utile, même si ce n'est pas une solution complète.
Je ne crois pas qu'il y a un moyen de faire ce que vous voulez. Le dialecte de C pris en charge par MSVC est plus proche de C89 que C99 (par exemple, il ne prend pas en charge les initialisateurs désignés non plus); Vous voulez vraiment quelque chose de plus proche de C89-with-C ++ - Commentaires-and-inline-Mot-clé.
Le problème avec que em> est que c ++ commentaires peut affecter l'exactitude du code C89 valide. Par exemple, la signification de cette ligne change sensiblement: P> int a = 10//* foo */2;
L'autre réponse fonctionne, mais je pense que c'est probablement trop fidèle. J'aime mieux cette réponse. N'utilisez tout simplement pas de commentaires de style C ++.
Malheureusement, il s'agit d'une base de code importante avec beaucoup de développeurs - faire une recherche de masse-et-remplacer sur les commentaires constituerait un effort majeur (en particulier tous les problèmes de contrôle source qui en résulteraient) et les développeurs se révolteraient probablement si forcé utiliser des commentaires de style ancien. Il peut également y avoir d'autres restrictions C89 que nous ne pouvions pas contourner. Nous vraiment i> Besoin GNU89 ou C99, mais sans les déclarations variables de style C ++, qui causent MSVC à Barf.
Ce n'est pas Win32 qui rend le code inabiletable, mais le compilateur. Vous pouvez utiliser GCC sur Win32 et obtenir une plus grande compatibilité multi-plate-forme. P>
Une autre possibilité est d'utiliser la compilation C ++ pour votre construction Win32; La compilation de la GCC aura déjà déterminé qu'il est valide C, et la compilation C ++ le rendra généralement plus fort. p>
[modifier] Une autre solution consiste à utiliser un serveur d'intégration continue tel que Cruisecontrol configuré de sorte que chaque fois que la plate-forme GCC codeurs enregistrement Code, le serveur CI peut le vérifier et la construire à l'aide de VC ++ (ou même d'appliquer un outil d'analyse statique tiers) et sur Erreur e-mail les résultats à l'utilisateur qui a vérifié dans le code erroné. Cette solution peut être un poids lourd pour le problème initial, mais peut donner de nombreuses autres avantages en plus. P>
GCC -STD = C89 CODE> Est-ce que pas B> Autoriser les commentaires de style C ++, il ne s'agit donc pas d'une solution réalisable.
@Paul R: Désolé, Paul j'ai supprimé cette déclaration avant de poster le commentaire (et après avoir lu votre message plus attentivement).
@Clifford - Aucun problème - Downvote supprimé. C ++ Compilation n'est probablement pas une option cependant - nous devrions apporter beaucoup de modifications à la base de code, par exemple. Casting du résultat des appels à Malloc et de traiter de nombreuses autres différences subtiles entre C et C ++.
La réclamation plus forte C i> est intéressante. Qu'est-ce que ça veut dire? Par exemple, la coulée des pointeurs de vidage le rend "faible C" pour moi.
kaizer.se: C ++ est plus fortement typé. En C ++ si vous lancez un vide *, attribuez-la à un autre type de pointeur, il ne compilera pas. En C, vous pouvez simplement obtenir un avertissement. Il est donc habituel de ne pas jeter un vide * en C et laissez le compilateur le comprendre. Il existe un argument de casting uniquement pour la compatibilité C ++ et assurez-vous que l'avertissement est activé et défini pour déclencher une erreur. Mais je suis d'accord c'est un problème. Pour peut-être compromettre le code C pour la compatibilité C ++ peut ne pas être sage sur l'équilibre.
@Clifford: Je pense que vous devriez toujours savoir quel langage informatique vous écrivez et écrivez pour cette langue. Le problème écrit dans l'intersection de C89 et C ++ est que vous obtenez un mauvais code en deux langues.
@David Thornley: Probablement, c'était une suggestion de considération, pas une recommandation. Vous pouvez bien sûr dire la même chose pour C89 / C99. Si les codeurs de Paul écrivent en C89, il n'y aurait aucun problème! Mais en fait, il (pas déraisonnablement) veut des variables C89 avec des commentaires de C99, de sorte que deux normes de codage sur deux normes.