Я немного растерялся относительно смысла этого заявления препроцессора C, - PullRequest
2 голосов
/ 18 декабря 2010

Итак, для начала, вот код с реальными именами, замененными на общие для ограничения путаницы.

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

Это фрагмент из некоторого исходного кода, который я просматривал и рассматривал как разветвление какспособ познакомиться с тонкостями языка программирования C .Так что, на мой неопытный взгляд, это, похоже, ничего не делает.На мой взгляд, определение чего-либо, а затем немедленное его определение, казалось бы, компенсируют друг друга.

Очевидно, я понимаю, что я не прав.Но почему я не прав?

Ответы [ 3 ]

5 голосов
/ 18 декабря 2010

Файл "commandsFile.def", вероятно, где-то внутри использует макрос "A_COMMANDS_MACRO".

Помните, что "#include" по сути вставляет включенный файл во включающий, поэтому #define все еще действуеткогда "commandsFile.def" обрабатывается.

4 голосов
/ 18 декабря 2010

То, что вы видите там, обычно называется X-MACRO. Техника заключается в определении макросов с помощью #define, а затем включении файла, который использует их с #include.

В качестве очень простого примера вы могли бы иметь заголовок (скажем, myheader.h ), который объявил 2 функции в виде:

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

А потом, в вашем коде:

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

#undef также иногда находятся во включенном файле.

Для получения дополнительной информации, посмотрите по этой ссылке в Википедии .

4 голосов
/ 18 декабря 2010

commandsFile.def должен содержать много строк:

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

, чтобы код создавал перечисление с доступными командами и их кодами.

Это может быть полезно при этом .defФайл используется программой, написанной на другом языке, поэтому вместо реализации анализа текста для этого используется препроцессор C.

...