以下宏是什么意思?

时间:2015-09-29 15:38:39

标签: c macros

下面的代码定义了一个宏,但我不知道它是如何工作的。我需要一个解释。

    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 };

1 个答案:

答案 0 :(得分: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()只是替换其参数,f代替static void Main(string[] args) { int[] arraySort = { 2, 5, 7, 3, 6, 3 }; int save; bool sorted = false; while(sorted == false) { for (int i = 0; i < (arraySort.Length - 1); i++) { sorted = true; if (arraySort[i] > arraySort[i + 1]) { save = arraySort[i]; arraySort[i] = arraySort[i + 1]; arraySort[i + 1] = save; sorted = false; } } } for (int i = 0; i < arraySort.Length; i++) { Console.WriteLine(arraySort[i]); } }

  

'##'预处理运算符执行标记粘贴。当一个宏   扩展后,每个'##'运算符两侧的两个标记都是   合并为一个令牌,然后替换'##'和两个   原始代币在宏观扩张中。