C中带有花括号的#define

Jer*_*hao 2 c c-preprocessor

我在C中找到了一种新形式的"#define",但我不明白这意味着什么.这是源代码:

#define OPT_SET_INT(s, l, v, h, i)  { OPTION_SET_INT, (s), (l), (v), NULL, \
           (h), PARSE_OPT_NOARG, NULL, (i) }
Run Code Online (Sandbox Code Playgroud)

这是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
};
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Jon*_*art 10

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

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

例如,在某些C文件中,您可能具有:

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

变为:

 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},
 };
Run Code Online (Sandbox Code Playgroud)

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