Je suis un peu perdu quant à la signification de cette déclaration de préprocesseur C,

StackOverflow https://stackoverflow.com/questions/4478904

  •  11-10-2019
  •  | 
  •  

Question

Alors, pour commencer, voici le code, avec des noms réels pour commutées génériques de confusion limite.

/* Get the list of Hotkey commands */
#define A_COMMANDS_MACRO(a, b, c, d) a = b ,
enum {
#include "commandsFile.def"
} ;
#undef  A_COMMANDS_MACRO

Ceci est un extrait de quelque code source que je cherchais plus et compte tenu de bifurquer comme un moyen de me familiariser avec les subtilités du C langage de programmation. Donc, à mon œil non averti, cela semble ne rien faire. Pour mon cerveau, définir quelque chose et puis tout de suite undef il semblerait annuler les uns les autres.

De toute évidence, je me rends compte que je me trompe. Mais pourquoi suis-je tort?

Était-ce utile?

La solution

Ce que vous voyez, il est généralement appelé X-MACRO. La technique consiste à définir des macros via #define, puis d'inclure un fichier qui fait les utiliser avec des #include.

Comme un exemple très simple, vous pourriez avoir un en-tête (par exemple myheader.h ) qui a déclaré 2 fonctions sous forme de:

int foo(MYTYPE a, MYTYPE_PTR b);
void bar(MYTYPE a, MYTYPE_PTR b);

Et puis, dans votre code:

#define MYTYPE int
#define MYTYPE_PTR int*
#include "myheader.h"
#undef MYTYPE
#undef MYTYPE_PTR

Les #undefs sont parfois dans le fichier inclus.

Pour plus d'informations, jetez un oeil sur ce lien Wikipedia .

Autres conseils

Le fichier "commandsFile.def" utilise probablement la macro quelque part "A_COMMANDS_MACRO" en interne.

Rappelez-vous que « #include » pâtes essentiellement le fichier inclus dans l'un comprenant, de sorte que le #define est toujours en vigueur lorsque « commandsFile.def » est traité.

Le commandsFile.def doit contenir plusieurs lignes:

A_COMMANDS_MACRO(A_COMMAND, 10, na, na)
A_COMMANDS_MACRO(OTHER_COMMAND, 23, na, na)

Alors que le code créerait un ENUM avec des commandes disponibles et leurs codes.

Il pourrait être utile lorsque ce fichier .def est utilisé par un programme écrit dans une autre langue, de sorte qu'au lieu de mettre en œuvre l'analyse de texte, il utilise C préprocesseur pour le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top