Supprimer les commentaires de code C/C++
Est-il un moyen facile de supprimer les commentaires de C/C++ source file sans aucun prétraitement. (c'est à dire, je pense que vous pouvez utiliser gcc -E, mais ce sera d'élargir les macros.) Je veux juste le code source avec des commentaires dépouillé, rien d'autre ne doit être changé.
EDIT:
Préférence vers un outil existant. Je ne veux pas avoir à écrire moi-même avec les regexes, je prévois aussi de nombreuses surprises dans le code.
- C'est réellement un bon exercice pour la simple utilisation d'un analyseur lexical et l'analyseur de!
- Devons-nous nous attendre à des trucs comme
/*
à l'intérieur des commentaires ou des chaînes de caractères? - C'est réellement un bon exercice pour l'utilisation d'un très compliquée analyseur lexical et l'analyseur.
- oui, je m'attends à beaucoup de trucs. Je ne veux pas avoir à faire toutes les hypothèses
- c'est ce que fait un bon exercice. 🙂
- Si le drdobbs.com/cpp/184401344 c'est vrai, vous ne pouvez pas supprimer les commentaires (s'attendant à tours) sans l'expansion des macros.
- êtes-vous sérieusement downvoting des gens qui essaient de vous aider?
- non, je ne downvoted un commentaire à ce jour et elle a lié à une terrible code
- Je ne crois pas que le Dr Dobbs, et gcc s'engage à:
error: pasting "/" and "/" does not give a valid preprocessing token
-ce qui est prévu, comme le commentaire de suppression qui se passe avant de prétraitement - il ne nécessite qu'un analyseur lexical, pas un analyseur à tous. Un tout en un C++ lexer est plus complexe que la plupart, il n'est pas encore terriblement difficile. Ne vous méprenez pas: je ne suis pas particulièrement à le recommander à l'aide d'un outil existant -- mais si l'analyse était nécessaire, il serait infiniment plus difficile qu'il ne l'est vraiment.
- Le préprocesseur est de la sémantique, en particulier ce qui concerne les commentaires. Ainsi, le pré-traitement nécessite un analyseur. C'est pourquoi tous les compilateurs C et C++ construire le préprocesseur dans le compilateur.
- mais non. Un analyseur traite de la structure des énoncés. Du point de vue de la langue, un commentaire est un jeton qui n'a pas de participer à toute structure plus grande. C'est pas différent d'un caractère espace (en fait, dans la phase trois de la traduction, chaque commentaire doit être remplacé par un seul caractère espace). Comme pour la construction du préprocesseur dans le compilateur, l'explication est beaucoup plus simple: le préprocesseur donne souvent de très grande sortie, afin de le communiquer au compilateur de manière efficace améliore la vitesse de compilation beaucoup.
- Je réfute vous donc - /* ... */ commentaires ne peuvent pas être traitées par un simple analyseur lexical. Vous semblez être l'amalgame entre la langue avec la mise en œuvre.
- mais non. Oui, C le style des commentaires peuvent être traitées par un analyseur lexical. Je ne suis pas l'amalgame entre la langue avec la mise en œuvre: je suis tout simplement vous dire ce que je sais par expérience-j'ai écrit un analyseur lexical pour le C et le C++ qui traite à la fois des styles de commentaires parfaitement bien. Tout ce qui était non-trivial par la plupart des normes, par rapport à un analyseur C++, "trivial", c'est exactement ce qu'il est.
- Comme vous, j'ai écrit un analyseur lexical (et un compilateur) pour C. Et comme vous, je sais ce qu'est un analyseur lexical n'est - il produit un flux de jetons (ou lexèmes, si nous voulons être pédant). Ce qu'est un analyseur lexical n'est de procéder à l'analyse sémantique, qui est ce qui est nécessaire pour gérer bloquer les commentaires. Ceci est mon dernier post sur ce sujet.
- Peut-être que c'est le meilleur-vous semblez être de répéter la même affirmation, sans preuve à l'appui. Vous n'avez pas encore une fois souligné que l'analyse sémantique que vous pensez est nécessaire pour analyser les observations correctement, juste répété que c'est (dont la norme, non seulement n'a pas besoin, mais n'a pas vraiment de même permettre). Vous substituer trigraphs, splice lignes, puis briser la source en jetons, et les séquences de l'espace blanc (y compris les commentaires). Si vous essayez de prendre plus de sémantique dans le compte de qui, vous le faites mal...
- N'est pas notre objectif habituellement pour obtenir plus de commentaires dans le code?
- ma réponse poignées de tous les cas pratiques. Il fonctionne parfaitement, aussi longtemps que
/*
,//
,*/
ne pas séparer en deux lignes. Qui est essentiellement une machine à état avec les états: 1 partie de la chaîne de caractères littérale, la partie 2 de C style de commentaire, partie 3 de style C++ commentaire, 4 autres. La manipulation de continuation de ligne trop. - Voir stackoverflow.com/a/13062682/1745001 pour savoir comment vraiment faire ce robuste (et simplement).
Vous devez vous connecter pour publier un commentaire.
Exécutez la commande suivante dans votre fichier source:
Grâce à KennyTM pour trouver les bons indicateurs. Voici le résultat complet:
test.c:
gcc -fpreprocessed -dD -E test.c
:#define foo bar\nfoo foo foo
gcc -fpreprocessed -dM -E test.c
pour obtenir le#define
-s en tant que bien, mais ils ne sont pas dans les emplacements d'origine.-fpreprocessed
supprime épissage en ligne, cette méthode échoue si une ligne de commentaire est concaténé avec la ligne suivante avec un trailing\
.#include
d fichiers et remplace les lignes commentées avec des lignes blanches plutôt que de supprimer les commentaires. FWIW une combinaison de sed et de la gcc ont toujours fonctionné parfaitement pour moi, voir stackoverflow.com/a/13062682/1745001.-fpreprocessed
n'est pas disponible sur clanggcc -fpreprocessed -dD -E -P -o test.c.tmp test.c && mv test.c.tmp test.c
. J'utilisemv
parce quegcc
refuser à remplacer l'entrée.Il dépend de la façon dont pervers, vos commentaires sont. J'ai un programme
scc
à la bande C et C++ commentaires. J'ai aussi un fichier de test pour elle, et j'ai essayé de GCC (4.2.1 sur MacOS X) avec les options actuellement sélectionnées réponse et GCC ne semble pas faire un travail parfait sur certains horriblement massacrés commentaires dans le cas du test.NB: Ce n'est pas un problème de la vie réelle - les gens n'écrivent pas de ces affreux code.
Considérer la (sous-ensemble - 36 135 lignes au total) des cas de test:
Sur mon Mac, la sortie de GCC (
gcc -fpreprocessed -dD -E subset.c
) est:La sortie de 'csc' est:
La sortie de 'csc -C' (qui reconnaît la double barre oblique commentaires) est:
Source pour la CSC maintenant disponible sur GitHub
La version actuelle de la CSC est de 6,60 (daté 2016-06-12), bien que le Git versions ont été créées sur 2017-01-18 (dans le fuseau horaire du Pacifique). Le code est disponible à partir de GitHub à https://github.com/jleffler/scc-snapshots. Vous pouvez également trouver des instantanés des versions précédentes (4.03, 4.04, 5.05) et deux pré-versions (6.16, 6.50) — ce sont tous marqués
release/x.yz
.Le code est encore principalement développé au RCS. Je suis toujours comment je veux utiliser les sous-modules ou d'un mécanisme similaire à gérer des fichiers de la bibliothèque comme
stderr.c
etstderr.h
(qui peut également être trouvé dans https://github.com/jleffler/soq).CSC version 6.60 tente de comprendre C++11 et C++14 et C++17 des constructions telles que les constantes binaires numériques, de la ponctuation, chaînes brutes, et hexadécimal de flotteurs. La valeur par défaut est C11 mode de fonctionnement. (À noter que le sens de la
-C
drapeau mentionné ci-dessus renversé entre la version 4.0 x décrit dans le corps de la réponse et la version 6.60 qui est actuellement la dernière version.)cd <place> && git init . && git commit -m "Initial commit" && git create && git push
. Crée un repo github.gcc-fpreprocessed -dD-E n'a pas de travail pour moi, mais ce programme n':
Il y a un stripcmt programme que peut faire ceci:
(par hlovdal's réponse à: question sur code Python pour ce)
int /* comment // */ main()
.// comment out next line \
/*
,//
,*/
ne pas séparer en deux lignes.C'est un script perl permettant de supprimer //une ligne et /* multi-ligne */commentaires
Il exige de votre fichier source comme un argument de ligne de commande.
Enregistrez le script dans un fichier, disons remove_comments.pl
et de l'appeler à l'aide de la commande suivante: perl -w remove_comments.pl [votre fichier source]
L'espoir qu'il sera utile
"/*"
ou"//"
, etc. vers le bas le trou de lapin.J'ai eu ce problème aussi. J'ai trouvé cet outil (Rpc-Decomment) , qui a travaillé pour moi. Mais il ignore si le commentaire de la ligne s'étend à la ligne suivante. Par exemple:
Dans ce cas, je ne pouvais pas trouver un moyen dans le programme de sorte juste cherché ignoré les lignes fixes et manuellement. Je crois qu'il y aurait une option pour que ou peut-être vous pouvez modifier le code source du programme fichier à le faire.
Parce que vous utilisez C, vous pouvez utiliser quelque chose qui est "naturel" de C. Vous pouvez utiliser le préprocesseur C seulement de supprimer les commentaires. Les exemples donnés ci-dessous fonctionne avec le préprocesseur C de GCC. Ils devraient fonctionner de la même ou de façon similaire avec les autres C perprocessors ainsi.
Pour C, utiliser
Il travaille également pour la suppression des commentaires de JSON, par exemple comme ceci:
Dans le cas où votre préprocesseur C n'est pas accessible directement, vous pouvez essayer de remplacer
cpp
aveccc -E
, qui appelle le compilateur C pour lui dire de s'arrêter après le préprocesseur scène.Dans le cas où votre compilateur C binaire n'est pas
cc
vous pouvez remplacercc
avec le nom de votre compilateur C binaire, par exempleclang
. Notez que tous les préprocesseurs soutien-fpreprocessed
.J'écris un programme en C utilisant la bibliothèque standard C, autour de 200 lignes, ce qui supprime les commentaires de C fichier de code source.
qeatzy/removeccomments
comportement
void init(/* do initialization */) {...}
"
et\"
.\
, de la ligne en cours est la partie de la ligne précédente.testing & profilage
J'ai testé avec plus disponible le code source qui contient de nombreux commentaires.
Dans ce cas, il ne le travail correctement et rapide, 2-5 plus rapide que gcc
utilisation
Je Crois que Si vous utilisez une déclaration, vous pouvez facilement supprimer les Commentaires de C
Seul Problème avec cette commande, il ne peut pas supprimer les commentaires qui contient plus d'une ligne.mais en utilisant cette expression, vous pouvez facilement mettre en œuvre une logique de Multi-Suppression de commentaires
Récemment, j'ai écrit du code Ruby pour résoudre ce problème. J'ai considérés comme des exceptions suivantes:
Ici est la code:
Il utilise le code suivant pour traiter chaque ligne dans le cas où ces commentaires apparaissent dans les chaînes. Si elle apparaît dans votre code, euh, de la malchance. Vous pouvez la remplacer par de plus en plus complexes de chaînes.
UTILISATION:
ruby -w inputfile outputfile
Je sais il est tard, mais j'ai pensé que je devais partager mon code et ma première tentative d'écriture d'un compilateur.
Remarque: ceci ne tient pas compte de
"\*/"
à l'intérieur d'un commentaire de plusieurs lignes e.g/\*...."*/"...\*
. Puis de nouveau, gcc 4.8.1 n'est pas non plus./*
a été traitée, la prochaine unspaced séquence de caractères*/
se termine le commentaire; il n'existe pas de mécanismes d'échappement à l'intérieur d'un commentaire, ce qui peut être ce que tu veux dire par GCC gère pas non plus. Votre code a des problèmes avec"/* Magritte notes: Ceci n'est pas une commentaire */"
(parce que c'est un littéral de chaîne, pas un commentaire mais il parlait de tuyaux, pas de commentaires).Ce programme fonctionne pour les deux conditions que j'ai.e //et /...../
int main(void)
. 2. Il ne gère pas les commentaires des séparateurs à l'intérieur des littéraux de chaîne de caractères et de constantes. 3. Il supprime unique/
caractère (essayer de l'exécuter sur son propre code source).