Maison >développement back-end >C++ >Comment l'ordre d'expansion des macros affecte-t-il la stringification en C et C ?

Comment l'ordre d'expansion des macros affecte-t-il la stringification en C et C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 17:24:10457parcourir

How Does Macro Expansion Order Affect Stringification in C and C  ?

Stringification : Comprendre le processus d'expansion des macros

Dans le domaine du C et du C, le terme « stringification » fait référence à la conversion d'un argument de macro en une chaîne littérale . Cependant, le processus peut être complexe, comme le démontre le scénario suivant :

#define foo 4
#define str(s) #s

Dans ce cas, str(foo) renvoie "foo" car le processus de stringification (l'opérateur #) est exécuté avant la macro. expansion (la directive #define). Cela garantit que foo reste un nom de macro et n'est pas remplacé par sa valeur.

Cependant, l'extrait de code suivant produit un résultat différent :

#define xstr(s) str(s)
#define str(s) #s
#define foo 4

Avec xstr(foo) appelé, le la sortie devient "4". Pour comprendre ce comportement, nous devons nous plonger dans les subtilités de l'expansion des macros.

Selon les normes C et C, le processus d'expansion des macros comprend les étapes suivantes :

  1. Identifier et traiter jetons précédés de # ou ## (l'opérateur de stringification).
  2. Remplacez les définitions de macro correspondantes pour n'importe quelle macro arguments.
  3. Remplacez chaque paramètre de fonction par le résultat du remplacement de la macro.
  4. Réanalysez le code pour des macros supplémentaires.

Dans le cas de xstr(foo) :

  1. La macro xstr ne nécessite aucune stringification (étape 1).
  2. foo est remplacé par sa valeur, 4 (étape 2).
  3. Dans la macro str, s est remplacé par 4, ce qui donne str(4) (étape 3).
  4. str(4) est réanalysé, donnant "4" (étape finale).

La principale différence ici réside dans l'étape où les arguments macro sont substitués (étape 2). Avec str(foo) dans le premier exemple, l'étape 2 se produit après que la stringification a été appliquée à l'étape 1. Par conséquent, foo n'est pas remplacé et la sortie reste "foo".

Pour résoudre ce problème, le La macro d'assistance xstr est utilisée. En imbriquant des macros, nous pouvons d'abord effectuer la substitution d'argument à l'étape 2, puis appliquer la stringification à l'étape 1, en garantissant l'obtention du résultat souhaité de « 4 ».

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