Maison > développement back-end > C++ > Pourquoi la stringification dans les macros C/C produit-elle des résultats inattendus lorsqu'elles sont imbriquées ?

Pourquoi la stringification dans les macros C/C produit-elle des résultats inattendus lorsqu'elles sont imbriquées ?

DDD
Libérer: 2024-12-17 11:03:25
original
646 Les gens l'ont consulté

Why Does Stringification in C/C   Macros Produce Unexpected Results When Nested?

Stringification : comprendre le processus

Lorsqu'il s'agit de macros dans des langages de programmation comme C et C, le concept de stringification peut être intrigant. La stringification convertit l'argument d'une macro en chaîne littérale. Cet article explore le fonctionnement de la stringification, en se concentrant particulièrement sur un scénario courant où des résultats de sortie inattendus sont obtenus.

En C, par exemple, la stringification est généralement effectuée à l'aide de l'opérateur #, comme dans :

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

Considérez la définition de macro suivante :

#define foo 4
Copier après la connexion

L'utilisation de la macro str sur foo produirait "foo" plutôt que "4". En effet, le processus d'expansion des macros en C implique plusieurs étapes :

  1. Traitement du préprocesseur : Les directives du préprocesseur comme #define sont traitées en premier.
  2. Stringification : Des macros comme str() sont appliquées, convertissant leurs arguments en chaînes.
  3. Jeton remplacement : Les jetons comme foo sont remplacés par leurs valeurs définies.

Dans le cas de str(foo), la stringification se produit à l'étape 2, convertissant foo en "foo". L'étape 3 remplace ensuite "foo" par la valeur définie 4, ce qui donne le résultat "4".

Cependant, lorsque str() est utilisé comme argument dans une autre macro, comme :

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

Un comportement inattendu peut survenir. L'utilisation de xstr(foo) afficherait "4" au lieu de "foo".

Pour comprendre pourquoi cela se produit, nous devons considérer les étapes impliquées dans l'expansion de xstr() :

  1. Stringification : aucun jeton # ou ## n'est présent, donc aucune action n'est entreprise.
  2. Remplacement d'argument : foo est remplacé par 4.
  3. Substitution de paramètre : s dans str() est remplacé par 4, ce qui donne str(4).
  4. Rescan : str(4) est réanalysé (produisant la sortie "4").

Dans xstr(foo), l'étape 2 remplace l'argument foo par 4, et alors seulement l'étape 1 est appliquée pour convertir le résultat stringifié str(4) à "4".

Cela démontre l'importance de comprendre le processus d'expansion des macros et l'ordre dans lequel les différentes étapes sont exécutées. En utilisant des macros d'assistance qui effectuent d'abord des étapes spécifiques, les développeurs peuvent contrôler le résultat de la stringification et obtenir le comportement 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal