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