我在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
谢谢。
这没什么特别的。宏名称(和括号)之后的所有内容都逐字地就地填充,除了被替换的宏参数之外。
在这种情况下,宏用于填充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。