Я немного потерян в отношении значения этого препроцессора C,

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

  •  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

А #undefS иногда также в включенном файле.

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

Другие советы

Файл "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 для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top