Was ist die erwartete Ausgabe bei der Neudefinition von "false" und umgekehrt?

8
%Vor%

Warum gibt es "01" aus?

    
hired777 01.03.2012, 19:55
quelle

2 Antworten

13

Wie Jerry Coffin bemerkt, können Sie kein Makro mit einem Namen definieren, der ein Schlüsselwort ist.

Wir könnten jedoch ein anderes, ähnliches Beispiel mit wohldefiniertem Verhalten und dem gleichen Ergebnis in Erwägung ziehen. Überlegen Sie:

%Vor%

Wenn Sie FALSE verwenden, wird es als Makro FALSE identifiziert und durch die Ersetzungsliste dieses Makros ersetzt, bei der es sich um das einzelne Token TRUE handelt. Dieser Ersatz wird dann erneut gescannt , damit weitere Makros ersetzt werden.

Das TRUE in der Ersetzung wird dann als Makro identifiziert und durch seine Ersetzungsliste ersetzt, die das einzige Token FALSE ist. Dieser Ersatz wird erneut erneut gescannt.

Wenn wir erneut scannen und ersetzen würden, würden wir in einer Endlosschleife enden, so dass die C (und C ++) Vorverarbeitungsspezifikationen angeben, dass der Makroersatz niemals innerhalb einer Ersatzliste rekursiv ist.

Da der Ersatz von FALSE in dieser endgültigen Ersetzungsliste zu einer Rekursion führen würde, wird der Makroersatz beendet und wir verbleiben mit FALSE , was der Name eines int mit einem Wert von 0 ist.

    
James McNellis 01.03.2012, 20:02
quelle
11

Jeder Versuch, ein reserviertes Wort neu zu definieren, führt zu undefiniertem Verhalten.

Bearbeiten:

§2.11 / 1: "Die in Tabelle 3 aufgeführten Bezeichner sind für die Verwendung als Schlüsselwörter reserviert." Ich werde nicht versuchen, alle von Tabelle 3 zu reproduzieren, aber es enthält sowohl falsch als auch wahr. Es mag für einige Fragen offen sein, ob dies ein absolutes Verbot ist, da derselbe Satz hinzufügt: "(Das heißt, sie werden in Phase 7 unbedingt als Schlüsselwörter behandelt"), was darauf hindeutet, dass es möglich ist, Schlüsselwörter neu zu definieren übrigens, da die beteiligten Makros vor Phase 7 erweitert würden.

In diesem Fall haben Sie jedoch auch <iostream> eingefügt, was eine weitere Regel ins Spiel bringt (§ 17.4.3.1.1): "Eine Übersetzungseinheit, die eine Kopfzeile enthält, darf keine Makros enthalten, die definierte Namen definieren oder eine solche Übersetzungseinheit definiert Makros für Namen, die lexikalisch mit Schlüsselwörtern identisch sind. "

Die Formulierung hier deutet stark darauf hin, dass es eine Absicht ist, dass es, wenn eine Übersetzungseinheit keine Kopfzeile enthält, frei wäre, ein Keyword wie bisher neu zu definieren, aber angesichts der Anwesenheit von #include <iostream> , Es gibt keine Frage, dass Sie undefiniertes Verhalten haben.

Sobald Sie undefiniertes Verhalten haben, gibt es wirklich nicht mehr zu sagen, "warum" irgendetwas passiert - an diesem Punkt ist der Standard sehr klar, dass jedes Verhalten zulässig ist.

    
Jerry Coffin 01.03.2012 19:56
quelle

Tags und Links