C ++ Präprozessor # definiert ein Schlüsselwort. Ist es normkonform?

Helfen Sie mit, die Debatte, die in den Kommentaren zu dieser Frage über Bool und 1 stattfindet, zu lösen:

Kann ein standardkonformer C ++ Präprozessor #define , um ein Sprachschlüsselwort neu zu definieren? Wenn ja, muss dies ein standardkonformer C ++ Preprozessor ermöglichen?

Wenn ein C ++ – Programm ein Sprachschlüsselwort neu definiert, kann dieses Programm selbst standardkonform sein?

   

In C ++ ist § 17.4.3.1.1 / 2 dem Verbieten eines Schlüsselworts am nächsten, was es nur in einer Übersetzungseinheit verbietet, die einen Standard-Bibliothekskopf enthält:

Eine Übersetzungseinheit, die eine Kopfzeile enthält, darf keine Makros enthalten, die in dieser Kopfzeile deklarierte oder definierte Namen definieren. Eine solche Übersetzungseinheit soll auch keine Makros für Namen definieren, die lexikalisch mit Schlüsselwörtern identisch sind.

Der zweite Satz dieses Absatzes wurde in C ++ 0x geändert, um # das #define eines Schlüsselworts (C ++ 0x FCD §17.6.3.3.1) ganz zu verbieten:

Eine Übersetzungseinheit darf nicht #define oder #undef lexikalisch mit Keywords identisch sein.

Bearbeiten: Wie Ken Bloom in Kommentaren zu seiner Antwort darauf hingewiesen hat, haben sich die Regeln in C ++ 0x nicht geändert; Der Text wurde gerade neu arrangiert, um Leute wie mich zu verwirren. 🙂

Arbeiten vom C ++ Arbeitsentwurf vom 2005-10-19 (da ich kein Standardhandy habe):

Abschnitt 16.3 definiert die Grammatik für #define identifier replacement-list-newline als #define identifier replacement-list-newline (objektähnliche Makros) oder eine von mehreren Konstruktionen, die mit #define identifier lparen (funktionsähnliche Makros) beginnen. identifier s sind in Abschnitt 2.10 als bezeichner identifier-nondigit | identifier identifier-nondigit | identifier digit identifier-nondigit | identifier identifier-nondigit | identifier digit identifier-nondigit | identifier identifier-nondigit | identifier digit . Abschnitt 2.11 zeigt an, dass eine bestimmte Liste von Identifikatoren in der Phase 7 der Kompilierung (Abschnitt 2.1) unbedingt als Schlüsselwörter behandelt wird, und ich folge daraus, dass sie daher in Phase 4, die eine Präprozessor-Erweiterung darstellt, nicht speziell behandelt werden. Daher scheint es, dass der Standard es erfordert, dass der Präprozessor Ihnen erlaubt, Sprachschlüsselwörter neu zu definieren (aufgelistet in Abschnitt 2.11) .

Der Präprozessor hat jedoch ein eigenes Schlüsselwort defined , nämlich eine Liste vordefinierter Makros (Abschnitt 16.8). Abschnitt 16.8 besagt, dass das Verhalten nicht definiert ist, wenn Sie diese neu definieren, es dem Präprozessor jedoch nicht verwehrt ist, diese als Makronamen zu erkennen.