Я немного растерялся относительно смысла этого заявления препроцессора C,
Итак, для начала, вот код с реальными именами, замененными на общие, чтобы избежать путаницы.
/* Get the list of Hotkey commands */
#define A_COMMANDS_MACRO(a, b, c, d) a = b ,
enum {
#include "commandsFile.def"
} ;
#undef A_COMMANDS_MACRO
Это фрагмент из некоторого исходного кода, который я просматривал и рассматривал разветвление как способ познакомиться с тонкостями языка программирования Си. Так что, на мой неопытный взгляд, это, похоже, ничего не делает. На мой взгляд, определение чего-либо, а затем немедленное его определение, казалось бы, компенсируют друг друга.
Очевидно, я понимаю, что я не прав. Но почему я не прав?
3 ответа
То, что вы видите там, обычно называется 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
s иногда находятся во включенном файле.
Для получения дополнительной информации, посмотрите на эту ссылку в Википедии.
Файл "commandsFile.def", вероятно, где-то внутри использует макрос "A_COMMANDS_MACRO".
Помните, что "#include" по сути вставляет включенный файл во включающий, поэтому #define остается в силе, когда обрабатывается "commandsFile.def".
commandsFile.def
должно содержать много строк:
A_COMMANDS_MACRO(A_COMMAND, 10, na, na)
A_COMMANDS_MACRO(OTHER_COMMAND, 23, na, na)
Чтобы код создавал перечисление с доступными командами и их кодами.
Это может быть полезно, когда этот файл.def используется программой, написанной на другом языке, поэтому вместо реализации анализа текста для этого используется препроцессор Си.