C中带有花括号的#define

时间:2014-03-20 05:33:46

标签: c c-preprocessor

我发现了一种新的形式" #define"在C但我不明白这意味着什么。这是源代码:

#define OPT_SET_INT(s, l, v, h, i)  { OPTION_SET_INT, (s), (l), (v), NULL, \
           (h), PARSE_OPT_NOARG, NULL, (i) }

这是OPTION_SET_INT的定义:

enum parse_opt_type {
    /* special types */
    OPTION_END,
    OPTION_ARGUMENT,
    OPTION_GROUP,
    OPTION_NUMBER,
    /* options with no arguments */
    OPTION_BIT,
    OPTION_NEGBIT,
    OPTION_COUNTUP,
    OPTION_SET_INT,
    OPTION_SET_PTR,
    OPTION_CMDMODE,
    /* options with arguments (usually) */
    OPTION_STRING,
    OPTION_INTEGER,
    OPTION_CALLBACK,
    OPTION_LOWLEVEL_CALLBACK,
    OPTION_FILENAME
};

在此存储库中的parse-option.h中: https://github.com/git/git

感谢。

1 个答案:

答案 0 :(得分:10)

这没什么特别的。宏名称(和括号)之后的所有内容都会逐字地填充,除了被替换的宏参数之外。

在这种情况下,宏用于填充struct option数组中的一个条目。

E.g。在某些C文件中,您可能有:

 struct option options[] = {
    OPT_SET_INT(foo, bar, snap, crackle, pop),
    OPT_SET_INT(somethingelse, runningout, offake, names, forthis),
 };

变为:

 struct option options[] = {
     { OPTION_SET_INT, foo, bar, snap, NULL, crackle, PARSE_OPT_NOARG, NULL, pop },
     { OPTION_SET_INT, somethingelse, runningout, offake, NULL, names, PARSE_OPT_NOARG, NULL, forthis},
 };

(注意宏定义中的\正在转义换行符,因此定义可以跨越多行。)

有关详细信息,请参阅GCC Macro Expansion