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
DDDoriginal
2024-12-17 11:03:25657parcourir

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

Considérez la définition de macro suivante :

#define foo 4

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)

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!

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