2015-09-29 5 views
-3

В приведенном ниже коде определяется макрос, но я не знаю, как он работает. Мне нужно объяснение.Что означает следующий макрос?

typedef struct 
    { 
    char *cmdname;  /* String containing the name of the command */ 
    void (*func)(int); /* Pointer to the action function */ 
    char *help;   /* Help string for the command */ 
    } parse_table; 

    #define ADD_CMD(name,f,helptxt) \ 
    const parse_table f##E __attribute__ ((section(".parsetable." name))) = { \ 
    .cmdname = name, \ 
    .func = f, \ 
    .help = helptxt }; 
+2

Вы пробовали прочитать документацию? Похож на VS. https://msdn.microsoft.com/en-us/library/503x3e3s.aspx – xxbbcc

+0

мой проф дал мне этот код. Я не понимаю эти «__attribute__ ((раздел (« .размерное. »Имя)))» раздел –

+0

Я бы предпочел видеть 'const char *' как элементы структуры. – Bathsheba

ответ

1

Если вы используете этот макрос, как

ADD_CMD("abc1", func_abc1, "abc1 help text") 
ADD_CMD("abc2", func_abc2, "abc2 help text") 
ADD_CMD("abc3", func_abc3, "abc3 help text") 

будет расширено препроцессором

const parse_table func_abc1E __attribute__ ((section(".parsetable." "abc1"))) = 
{ .cmdname = "abc1", .func = func_abc1, .help = "abc1 help text" }; 
const parse_table func_abc2E __attribute__ ((section(".parsetable." "abc2"))) = 
{ .cmdname = "abc2", .func = func_abc2, .help = "abc2 help text" }; 
const parse_table func_abc3E __attribute__ ((section(".parsetable." "abc3"))) = 
{ .cmdname = "abc3", .func = func_abc3, .help = "abc3 help text" }; 

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

Макрос ADD_CMD() просто подставляет свои аргументы и делает Concatenation для f:

Оператор предобработки «##» выполняет маркер вставки. Когда макрос расширяется, два токена по обе стороны от каждого оператора «##» равны , объединенные в один токен, который затем заменяет оригинальные маркеры «##» и два в расширении макроса.