Maison > développement back-end > C++ > Comment l'ordre d'expansion des macros affecte-t-il la stringification dans le prétraitement C ?

Comment l'ordre d'expansion des macros affecte-t-il la stringification dans le prétraitement C ?

DDD
Libérer: 2024-12-19 14:10:10
original
761 Les gens l'ont consulté

How Does Macro Expansion Order Affect Stringification in C Preprocessing?

Dévoilement de la magie de la stringification

Dans le domaine de la programmation, la stringification se présente comme une technique polyvalente qui permet aux macros de générer dynamiquement des chaînes basées sur leurs arguments. La clé pour comprendre comment ce processus se déroule est l'ordre méticuleux dans lequel l'expansion de la macro se produit.

Considérez la définition de macro suivante :

#define foo 4
#define str(s) #s
Copier après la connexion

Lorsque str(foo) est évalué, il en résulte le expansion de #s en "foo" car l'opération stringify (#) a priorité sur l'expansion textuelle. Cependant, lorsque vous introduisez des couches supplémentaires d'indirection de macro, l'ordre des opérations devient crucial.

Le cas de xstr(foo)

Définir la ou les macros xstr(foo) as :

#define xstr(s) str(s)
#define str(s) #s
#define foo 4
Copier après la connexion

L'application de cette macro à xstr(foo) produit un résultat inattendu : "4". La clé pour percer ce mystère réside dans les étapes suivantes de l'expansion des macros :

  1. Prétraitez les jetons préfixés par # ou ##.
  2. Développez les macros dans les arguments de la macro.
  3. Remplacez les paramètres de la macro par le texte de remplacement correspondant.
  4. Analysez à nouveau le résultat pour une autre macro extensions.

Lorsque xstr(foo) est traité :

  1. # dans xstr(s) est identifié.
  2. foo est remplacé par 4.
  3. #s dans str(s) est remplacé par #4.
  4. str(4) est maintenant réanalysé.

Puisque #4 est une chaîne littérale, il se résout en "4". Par conséquent, xstr(foo) est évalué à "4" plutôt qu'à "foo" car l'opération de stringification prend effet après l'expansion textuelle.

Une leçon sur l'ordre des macros

Ceci Ce résultat apparemment contre-intuitif met en évidence l’importance de l’ordre macro. Pour éviter de telles ambiguïtés, il est souvent recommandé d'utiliser une macro d'assistance pour exécuter une étape avant d'appliquer l'opération stringify. Cela garantit le résultat souhaité en définissant clairement l'ordre des opérations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal