Die Kommentare werden in Phase 3 der Programmübersetzung 1 entfernt : Jeder Kommentar wird durch ein Leerzeichen ersetzt. Der Kommentar /*nt*/
ist also definitiv kein Zeichen.
Wenn keine des int
, main
, i
, a
oder return
werden als Vorverarbeitung Makros definiert, Parsen des Programms erzeugt 14 - Token (nicht 13):
int
main
(
)
{
i
a
=
10
;
return
0
;
}
Sofern nicht i
als Typ mit einer typedef
Anweisung definiert, liegt ein Syntaxfehler vor, i a
der nicht mit einer Regel in der C-Grammatik übereinstimmt.
Sie können also keine Kommentare in Variablennamen schreiben. Der Kommentar teilt den Bezeichner in zwei separate Token auf. Dies gilt für alle Vorverarbeitungs- und C-Sprach-Token 2 .
Beachten Sie jedoch, dass Sie Kommentare an ungewöhnlichen Stellen einfügen können, z. B. zwischen unären Operatoren und ihrem Operanden oder zwischen der #
und der Vorverarbeitungsanweisung und ihren Argumenten:
#include<stdio.h>
#defineSTAT(a)-1
#ifdefSTAT
intmain(){
inta=+1;
printf("Hello ""world!\n");
returnSTAT;
}
#endif
Die obige Makrodefinition definiert jedoch kein funktionsähnliches Makro, sondern ein reguläres Makro STAT
, das erweitert wird ( a ) - 1
.
Variablennamen können wie jedes andere Token durch maskierte Zeilenumbrüche aufgeteilt werden. Escape-Zeilenumbrüche sind Sequenzen oder \
unmittelbar gefolgt von einem Zeilenumbruch. Diese Sequenzen werden während der Phase 2 der Programmübersetzung aus dem Quellcode entfernt. Ihr Hauptzweck besteht darin, lange Makrodefinitionen in mehreren Zeilen zu unterbrechen.
Unten ist ein Codefragment 3 , das die gleichen 14 Token erzeugt:
\
i\
nt\
ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
0;}
Beachten Sie, dass der Code-Colorizer die in Scheiben geschnittenen und gewürfelten Schlüsselwörter und Kommentare übersehen hat :)
1) Dieses Verhalten wurde in ANSI-C aka C89 angegeben. Einige alte Compiler hatten ein subtil unterschiedliches Verhalten, was zum Einfügen von Token führte, aber solche Besonderheiten sind nur von historischem Interesse.
2) Sie können fast einen Kommentar in eine Zeichenfolgenkonstante einfügen, indem Sie die Tatsache ausnutzen, dass benachbarte Zeichenfolgenkonstanten in Phase 6 der Programmübersetzung verkettet werden: printf("Hello "/* my name is Luca */"world!\n");
3) Dieser Weihnachtsbaum- Präsentationsstil ist nicht für die Verwendung in realen Programmen gedacht. Er zeigt, wie die Eingabeverarbeitungsfunktionen von C missbraucht werden. Ausgefeiltere Tricks haben den International Obfuscated C Code Contest gewonnen
cpp -traditional
implementiert , auf erweitertia = 10;
.