下面的代码定义了一个宏,但我不知道它是如何工作的。我需要一个解释。
typedef struct
{
char *cmdname; /* String containing the name of the command */
void (*func)(int); /* Pointer to the action function */
char *help; /* Help string for the command */
} parse_table;
#define ADD_CMD(name,f,helptxt) \
const parse_table f##E __attribute__ ((section(".parsetable." name))) = { \
.cmdname = name, \
.func = f, \
.help = helptxt };
答案 0 :(得分:1)
如果您将该宏用作
ADD_CMD("abc1", func_abc1, "abc1 help text")
ADD_CMD("abc2", func_abc2, "abc2 help text")
ADD_CMD("abc3", func_abc3, "abc3 help text")
它将由预处理器扩展为
const parse_table func_abc1E __attribute__ ((section(".parsetable." "abc1"))) =
{ .cmdname = "abc1", .func = func_abc1, .help = "abc1 help text" };
const parse_table func_abc2E __attribute__ ((section(".parsetable." "abc2"))) =
{ .cmdname = "abc2", .func = func_abc2, .help = "abc2 help text" };
const parse_table func_abc3E __attribute__ ((section(".parsetable." "abc3"))) =
{ .cmdname = "abc3", .func = func_abc3, .help = "abc3 help text" };
因此,它允许您通过编写ADD_CMD
行来定义和分配许多类似的结构。
宏ADD_CMD()
只是替换其参数,f
代替static void Main(string[] args)
{
int[] arraySort = { 2, 5, 7, 3, 6, 3 };
int save;
bool sorted = false;
while(sorted == false) {
for (int i = 0; i < (arraySort.Length - 1); i++)
{
sorted = true;
if (arraySort[i] > arraySort[i + 1])
{
save = arraySort[i];
arraySort[i] = arraySort[i + 1];
arraySort[i + 1] = save;
sorted = false;
}
}
}
for (int i = 0; i < arraySort.Length; i++)
{
Console.WriteLine(arraySort[i]);
}
}
:
'##'预处理运算符执行标记粘贴。当一个宏 扩展后,每个'##'运算符两侧的两个标记都是 合并为一个令牌,然后替换'##'和两个 原始代币在宏观扩张中。