Maison > développement back-end > C++ > Pourquoi la stringification produit-elle « foo » dans un cas et « 4 » dans un autre ?

Pourquoi la stringification produit-elle « foo » dans un cas et « 4 » dans un autre ?

Linda Hamilton
Libérer: 2024-12-24 04:20:10
original
921 Les gens l'ont consulté

Why Does Stringification Produce

Stringification dévoilée : une explication étape par étape

La stringification est une technique de macro puissante qui convertit un jeton donné en une chaîne littérale. Pour comprendre ses subtilités, examinons le scénario suivant :

define foo 4

define str(s) #s

Avec str(foo), le résultat attendu est " foo" car on pense que la stringification se produit avant l'expansion du texte. Cependant, dans le deuxième exemple :

define xstr(s) str(s)

define str(s) #s

define foo 4

La sortie de xstr(foo) devient « 4 ». Pour résoudre cet écart, nous examinons les étapes spécifiques impliquées dans l'expansion des macros :

  1. Directives de prétraitement : Les macros commençant par # ou ## sont traitées en premier.
  2. Substitution d'arguments : Les arguments dans les macros sont remplacés par les arguments correspondants. valeurs.
  3. Substitution de paramètres : Les paramètres sont remplacés par leurs valeurs d'argument respectives.
  4. Recherche de macros : Le texte résultant est réanalysé pour des macros supplémentaires. .

Application de ces étapes à xstr(foo):

  1. Rien ne se passe car str(s) ne contient ni # ni ##.
  2. foo est remplacé par 4, ce qui donne xstr(4).
  3. Dans str(s), s est remplacé par 4, générant str(4).
  4. str(4) est réanalysé, produisant le résultat final de "4."

Maintenant, examinons str(foo) :

  1. L'argument foo est toujours foo (non remplacé par 4).
  2. Le texte de remplacement, #s, produit "foo".

Le nœud du problème réside dans la séquence d'exécution. À l'étape 1, lorsque str(foo) est évalué, foo n'a pas encore été remplacé par 4. Par conséquent, l'étape de stringification donne "foo".

Par conséquent, l'utilisation d'une macro d'assistance comme xstr permet exécution séparée des étapes 2 et 1, fournissant finalement le comportement de stringification souhaité.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal