Maison > développement back-end > C++ > Pourquoi `xstr(foo)` génère-t-il « 4 » alors que `str(foo)` génère « foo » dans une extension de macro de type C ?

Pourquoi `xstr(foo)` génère-t-il « 4 » alors que `str(foo)` génère « foo » dans une extension de macro de type C ?

Linda Hamilton
Libérer: 2024-12-28 14:30:11
original
240 Les gens l'ont consulté

Why Does `xstr(foo)` Output

Comprendre la stringification : les étapes clés de l'expansion des macros

Le concept de stringification dans les langages de type C vous permet de convertir des expressions en chaînes. Comprendre les étapes impliquées dans ce processus est crucial pour une utilisation efficace des macros.

Le problème : la différence de sortie

Considérez la définition de macro suivante :

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

Lorsque vous utilisez str(foo) dans votre code, il affichera "foo" car la stringification (étape 1) est effectuée avant l'expansion du texte (étape 2).

Cependant, si vous définissez une macro supplémentaire :

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

Et utilisez xstr(foo), le résultat sera étonnamment "4". Cette différence nécessite une exploration du processus de stringification.

Étapes de l'expansion de macro

Le processus d'expansion de macro comporte plusieurs étapes, selon les normes C et C :

  1. Prétraitement : Les jetons précédés de # ou ## sont traité.
  2. Remplacement d'argument : Les macros sont appliquées à chaque argument.
  3. Substitution de paramètres : Les paramètres sont remplacés par les résultats de macro correspondants.
  4. Rescanning : Le code est réanalysé pour une macro supplémentaire expansion.

Application des étapes à xstr(foo)

  1. Prétraitement : Aucun jeton applicable.
  2. Remplacement d'argument : foo est remplacé par 4.
  3. Substitution de paramètres : Dans str(s), s est remplacé par 4, produisant str(4).
  4. Rescanning : str (4) est réanalysé, ce qui donne la sortie "4".

Pourquoi str(foo) génère "foo"

Contrairement à xstr(foo), str(foo) renvoie "foo" car :

  • Prétraitement : Aucun jeton de stringification présent.
  • Remplacement d'argument : Aucun applicable.
  • Substitution de paramètres : #foo reste inchangé car foo n'a pas été remplacé par 4.
  • Rescanning : #foo n'est pas réanalysé , produisant "foo".

Par conséquent, l'utilisation d'une macro d'assistance comme xstr garantit que l'expansion du texte (étape 2) est effectuée avant la stringification (étape 1), permettant des conversions de chaînes correctes.

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