在C语言中使用花括号的#define。

6
我在C语言中发现了一种新的“#define”形式,但我不知道它是什么意思。以下是源代码:

#define MAX(a,b) ((a) > (b) ? (a) : (b))

#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的定义:

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 谢谢。

你以前从未在宏定义中看到过宏吗? - Ignacio Vazquez-Abrams
嗯,我从未见过以这种方式填充值的定义。 - Jerry Zhao
1个回答

14

这完全没有什么特别的。除了宏名称(和括号)后面的所有内容都会原封不动地放置,宏参数除外,它们将被替换。

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

例如,在某个 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宏扩展


但是程序如何知道这个定义应该填充“struct option”,而不是文件中定义的其他结构? - Jerry Zhao
明白了,非常感谢! - Jerry Zhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接