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
Linda Hamiltonoriginal
2024-12-28 14:30:11210parcourir

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

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)

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!

Déclaration:
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