Frage

Ich war auf der Suche auf dem Programm unter http: //www0.us.ioccc. org / 1988 / westley.c , in erwähnt eine andere SO beantworten - es soll den Wert von pi drucken, etwa 3.142, aber wenn ich es kompilieren und ausführen ich 0.250. Es sieht aus wie wenn der GCC-Präprozessor (beide 4.1.2 und 3.4.6 getestet) läuft auf dem Code, wandelt

#define _ -F<00||--F-OO--;
_-_-_

-F<00||--F-OO--;- -F<00||--F-OO--;- -F<00||--F-OO--;

, aber ich denke, für das Programm zu arbeiten, soll es sein

-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;

d. GCC ist einen extra Raum vor der „Makro“ Expansion einsetzen. Ist das die Art und Weise #define soll arbeiten? (Hat sich das seit 1988 geändert?)

EDIT : Auch alle Informationen darüber, wie diese Räume zu verhindern, zeigt sich würde geschätzt

.
War es hilfreich?

Lösung

Der Präprozessor arbeitet auf Token, nicht streng Text. Technisch gesehen ist es nicht dazwischen, „ein Leerzeichen setzen“, aber wenn Sie es ausdrücklich sagen zwei Token einzufügen zusammen mit dem ## Operator, es wird es nicht tun. In diesem Fall sind die beiden - die über Makrozeilen werden als zwei verschiedene Token gezählt - sowohl was bedeutet, einstellige minus, nicht verringern

.

siehe auch: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

Andere Tipps

Erst viel ältere Preprozessoren einfügen nicht, dass zusätzliche Raum - beachten Sie, dass Original-Eintrag vor mehr als 20 Jahren im Jahr 1988 vorgelegt wurde, bevor die 1989-Version der C-Standard standardisiert wurde. Sie können die -traditional-cpp Flag an den GCC Präprozessor übergeben, die es, das Verhalten der altmodischen C Präprozessoren zu imitieren verursacht, wie ISO C Preprozessoren gegenüber.

Von dem C99-Standard:

  

Eine Vorverarbeitung Richtlinie von der Form

     

# definieren Kennung Ersatz-Liste new-line

     

definiert ein Objekt ähnlichen Makro, das jede nachfolgende Instanz des Makronamen verursacht durch die Ersatz Liste der Vorverarbeitung Token ersetzt werden, die den Rest der Richtlinie dar.

So Makros arbeiten auf Token und die whitepace ist zu erwarten.

Und Sie können die Ausgabe der Code einfügen Operator, ## verwenden wollen, aber Sie müssen einige weitere Makro Hässlichkeit verwenden, es zu tun:

#define PASTE2( x, y) x##y
#define PASTE( x, y) PASTE2(x, y)

#define _ -F<00||--F-OO--;


PASTE(PASTE(PASTE(PASTE(_,-),_),-),_)

Also ich bin nicht sicher, dass dies für Sie eine wirkliche Antwort ist.

Sie können eine weniger hässliche Reihe von Makros verwenden, um die expresions zu erhalten Sie wollen - es wird noch einige Räume, aber die Räume werden mit der Erstellung der "-- der Betreiber nicht stören:

_ PASTE(-,_) PASTE(-,_)

Ich bezweifle immer noch das ist, was Sie wollen, aber.

Ja, gcc einfügt zusätzliche Leerzeichen (überprüfen, indem Sie die stdout Ausgabe von gcc -E westley.c Kontrolle (. Soweit ich weiß, das Verhalten der Norm entspricht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top