我发现了一种新的形式" #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
感谢。
答案 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。