Der C-Präprozessor arbeitet mit "Token" und wenn immer die Möglichkeit besteht, die Bedeutung oder Ambiguität zu ändern, fügt er immer Leerzeichen hinzu, um die Bedeutung zu bewahren.
Ihr Beispiel Betrachten sie
(B)
gibt es keine Zweideutigkeit oder Sinn zu verändern, ob es einen Raum zwischen (
und )
hinzugefügt oder nicht, unabhängig von dem Makrowert von B
.
Aber es ist nicht der Fall mit
|B|
auf der Makro B
Je dies oben könnte entweder ||
oder |something|
sein. So wird Präprozessor gezwungen, ein Leerzeichen hinzuzufügen, um C der lexikalischen Regeln zu halten.
Das gleiche Verhalten kann mit anderen Token zu erkennen, dass die Bedeutung verändern könnte.Zum Beispiel würde
#define B +
B+
+ +
produzieren im Gegensatz zu
++
für den genannten Grund.
Dies ist jedoch nur der Präprozessor, der den C lexikalischen Regeln entspricht. GCC hat und unterstützt einen alten Präprozessor namens traditionellen Prozessor, die keine zusätzlichen Leerzeichen hinzufügen würde. wenn Sie Präprozessor in traditionellen Modus Zum Beispiel rufen:
gcc -E -traditional-cpp file.c
dann
#define B
(B)
|B|
produzieren (ohne Leerzeichen)
()
||
Wahrscheinlich, weil '|' und '' || sind verschiedene Betreiber. Ich hoffe jemand schreibt eine Antwort mit genauen Regeln die cpp benutzt. – hyde
Es kann lustig sein, jemanden zu sehen, der 'x | schreibt Wert | SOME_FLAG' und es stellt sich heraus, dass es 'x || ist SOME_FLAG', ist es wahrscheinlich so, also wird es nicht kompilieren. –
Das würde aber bedeuten, dass '||' als Sonderfall behandelt wird. Dies könnte vermieden werden, indem * immer * Leerzeichen eingefügt werden, die nicht gegen C-Regeln stehen (mit Ausnahme von Makroverkettungen). – usr2564301