Io sono un po 'perso per quanto riguarda il significato di questa affermazione preprocessore C,

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

  •  11-10-2019
  •  | 
  •  

Domanda

Quindi, per cominciare, ecco il codice, con nomi reali commutati per quelli generici al limite di confusione.

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

Questo è un frammento da qualche codice sorgente ho cercato più e considerare sborsare come un modo per familiarizzare con la complessità del C linguaggio di programmazione. Così, al mio occhio inesperto, questo sembra non fare nulla. Per il mio cervello, la definizione di qualcosa e poi subito indefiniti sembrerebbe annullarsi a vicenda.

Ovviamente, mi rendo conto che ho sbagliato. Ma perché mi sbaglio?

È stato utile?

Soluzione

Quello che si vede di solito c'è chiama X-MACRO. La tecnica consiste nel definire le macro via #define, e quindi tra cui un file che si avvale di loro con #include.

Come un esempio molto semplice, si potrebbe avere un colpo di testa (ad esempio myheader.h ) che ha dichiarato 2 funzioni in forma di:

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

E poi, nel codice:

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

I #undefs sono a volte nel file incluso pure.

Per ulteriori informazioni, date un'occhiata a questo link Wikipedia .

Altri suggerimenti

The "commandsFile.def" file probably uses the "A_COMMANDS_MACRO" macro somewhere internally.

Remember that "#include" essentially pastes the included file into the including one, so the #define is still in effect when "commandsFile.def" is processed.

The commandsFile.def should contain many lines:

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

So that the code would create an enum with available commands and their codes.

It could be useful when this .def file is used by a program written in other language, so that instead of implementing text parsing, it uses C preprocessor to do this.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top