Es hängt davon ab, wie pervers Ihre Kommentare sind. Ich habe ein Programm scc
zum Entfernen von C- und C ++ - Kommentaren. Ich habe auch eine Testdatei dafür und habe GCC (4.2.1 unter MacOS X) mit den Optionen in der aktuell ausgewählten Antwort ausprobiert - und GCC scheint bei einigen der schrecklich geschlachteten Kommentare im Internet keine perfekte Arbeit zu leisten Testfall.
NB: Dies ist kein echtes Problem - die Leute schreiben keinen so schrecklichen Code.
Betrachten Sie die (Teilmenge - 36 von insgesamt 135 Zeilen) des Testfalls:
/\
*\
Regular
comment
*\
/
The regular C comment number 1 has finished.
/\
\/ This is not a C++/C99 comment!
This is followed by C++/C99 comment number 3.
/\
\
\
/ But this is a C++/C99 comment!
The C++/C99 comment number 3 has finished.
/\
\* This is not a C or C++ comment!
This is followed by regular C comment number 2.
/\
*/ This is a regular C comment *\
but this is just a routine continuation *\
and that was not the end either - but this is *\
\
/
The regular C comment number 2 has finished.
This is followed by regular C comment number 3.
/\
\
\
\
* C comment */
Auf meinem Mac gcc -fpreprocessed -dD -E subset.c
lautet die Ausgabe von GCC ( ):
/\
*\
Regular
comment
*\
/
The regular C comment number 1 has finished.
/\
\/ This is not a C++/C99 comment!
This is followed by C++/C99 comment number 3.
/\
\
\
/ But this is a C++/C99 comment!
The C++/C99 comment number 3 has finished.
/\
\* This is not a C or C++ comment!
This is followed by regular C comment number 2.
/\
*/ This is a regular C comment *\
but this is just a routine continuation *\
and that was not the end either - but this is *\
\
/
The regular C comment number 2 has finished.
This is followed by regular C comment number 3.
/\
\
\
\
* C comment */
Die Ausgabe von 'scc' ist:
The regular C comment number 1 has finished.
/\
\/ This is not a C++/C99 comment!
This is followed by C++/C99 comment number 3.
/\
\
\
/ But this is a C++/C99 comment!
The C++/C99 comment number 3 has finished.
/\
\* This is not a C or C++ comment!
This is followed by regular C comment number 2.
The regular C comment number 2 has finished.
This is followed by regular C comment number 3.
Die Ausgabe von 'scc -C' (die doppelte Schrägstriche erkennt) lautet:
The regular C comment number 1 has finished.
/\
\/ This is not a C++/C99 comment!
This is followed by C++/C99 comment number 3.
The C++/C99 comment number 3 has finished.
/\
\* This is not a C or C++ comment!
This is followed by regular C comment number 2.
The regular C comment number 2 has finished.
This is followed by regular C comment number 3.
Quelle für SCC jetzt auf GitHub verfügbar
Die aktuelle Version von SCC ist 6.60 (vom 12.06.2016), obwohl die Git-Versionen am 18.01.2017 (in der Zeitzone USA / Pazifik) erstellt wurden. Der Code ist bei GitHub unter https://github.com/jleffler/scc-snapshots erhältlich . Sie können auch Snapshots der vorherigen Versionen (4.03, 4.04, 5.05) und zwei Vorversionen (6.16, 6.50) finden - diese sind alle mit Tags versehen release/x.yz
.
Der Code wird noch hauptsächlich unter RCS entwickelt. Ich arbeite immer noch daran, wie ich Submodule oder einen ähnlichen Mechanismus verwenden möchte, um allgemeine Bibliotheksdateien wie stderr.c
und zu verarbeiten stderr.h
(die auch unter https://github.com/jleffler/soq zu finden sind ).
SCC Version 6.60 versucht, C ++ 11-, C ++ 14- und C ++ 17-Konstrukte wie Binärkonstanten, numerische Interpunktion, rohe Zeichenfolgen und hexadezimale Gleitkommazahlen zu verstehen. Standardmäßig wird der C11-Modus verwendet. (Beachten Sie, dass die Bedeutung des -C
oben erwähnten Flags zwischen der im Hauptteil der Antwort beschriebenen Version 4.0x und der Version 6.60, die derzeit die neueste Version ist, gewechselt ist.)