Vraag C ++ preprocessor # definieert een sleutelwoord. Is het conformeren van normen?


Help het debat oplossen dat er in de opmerkingen op te vinden is deze vraag over bool en 1:

Kan een standaard-conforme C ++ preprocessor toestaan ​​om te gebruiken #define een taalzoekwoord opnieuw definiëren? Zo ja, moet een standaard-conforme C ++ preprocessor dit toestaan?

Als een C ++ -programma een taalsleutelwoord opnieuw definieert, kan dat programma dan zelf voldoen aan de normen?


17
2018-04-28 01:04


oorsprong


antwoorden:


In C ++ is het het dichtste bij het verbieden #defineEen sleutelwoord is §17.4.3.1.1 / 2, dat het alleen uitsluit in een vertaaleenheid die een standaard bibliotheekkop bevat:

Een vertaaleenheid die een header bevat, mag geen macro's bevatten die de in die header gedeclareerde of gedefinieerde namen definiëren. Evenmin zal een dergelijke vertaaleenheid macro's voor namen definiëren die lexicaal identiek zijn aan trefwoorden.

De tweede zin van die alinea is in C ++ 0x gewijzigd om het helemaal te verbieden #defineeen sleutelwoord (C ++ 0x FCD §17.6.3.3.1):

Een vertaaleenheid zal #define of #undef namen niet lexicaal identiek aan sleutelwoorden zijn.   


20
2018-04-28 01:10



Werken vanuit de 2005-10-19 C ++ werkconcept (aangezien ik geen standaard bij de hand heb):

Paragraaf 16.3 definieert de grammatica voor #define zijn #define identifier replacement-list-newline (Object-like macro's) of een van de verschillende constructies die beginnen met #define identifier lparen (functie-achtige macro's). identifiers zijn gedefinieerd in sectie 2.10 om te zijn identifier-nondigit | identifier identifier-nondigit | identifier digit. Sectie 2.11 geeft aan dat een bepaalde lijst van identifiers worden onvoorwaardelijk behandeld als sleutelwoorden in fase 7 van de compilatie (sectie 2.1), en ik concludeer dat ze daarom niet speciaal behandeld worden in fase 4, wat de uitbreiding van de preprocessor is. Het lijkt er dus op dat de standaard vereist dat de preprocessor u toestaat taalwoorden te herdefiniëren (vermeld in Sectie 2.11).

De preprocessor heeft echter een eigen sleutel, namelijk defined, evenals een lijst met vooraf gedefinieerde macro's (Paragraaf 16.8). Sectie 16.8 stelt dat het gedrag niet gedefinieerd is als u deze herdefinieert, maar verbiedt niet dat de preprocessor deze als macronamen herkent.


5
2018-04-28 02:02