我遇到了这段代码,我无法理解,无法在任何地方找到答案:
#define CMD_MAP(F)
F(READ, NETFN_SE, 0x01, 1) \
F(WRITE, NETFN_SE, 0x02, 8)
typedef enum {
#define CMD_ENUM(A, B, C, D) A ,
CMD_MAP(CMD_ENUM)
} cmd_t;
这里的语法规则是什么? CMD_MAP(F)表示将这些参数传递给函数F?
答案 0 :(得分:1)
在实际编译开始之前处理宏。它们只是预处理器应该如何编辑文本(代码)的规则。
CMD_MAP(foo)
扩展为foo(READ, NETFN_SE, 0x01, 1) foo(WRITE, NETFN_SE, 0x02, 8)
,然后进行编译。
反斜杠只是告诉预处理器宏继续在下一行。
/编辑:宏用德语写成'c'而不是'k';)
/ Edit2:基本宏功能指南
makro的基本语法是:
#define MAKRO_NAME(argument1, argument2, ...) <definition of replacement-text>
举个简单的例子:
#define GET_A(val) val.a
这背后的原理是,当“调用”宏时,'val.a'中的val将被括在括号内的任何内容替换。因此,如果我在代码中编写以下代码:int x = GET_A(someObject);
它将被扩展(预编译)为:int x = someObject.a;
以及:
#define GET_SOMEVAL(obj, val) obj.val
//...
int x = GET_SOMEVAL(myObject, myVal);
将扩展为:int x = myObject.myVal;
如您所见,这些只是文本替换,预处理器对C ++的语法或语法一无所知。宏不需要对函数调用或其他任何事情做任何事情,它们只是通过替换文本来工作。 在宏中有更多(暗)魔法,但这应该做到。
回到你的问题:在编写CMD_MAP(this here replaces F)