C中带有花括号的#define

问题描述 投票:2回答:1

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

#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

谢谢。

c c-preprocessor
1个回答
10
投票

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

在这种情况下,宏用于填充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 Macro Expansion

© www.soinside.com 2019 - 2024. All rights reserved.