#define映射

时间:2013-06-24 18:13:10

标签: c++ c-preprocessor

我遇到了这段代码,我无法理解,无法在任何地方找到答案:

#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?

1 个答案:

答案 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)

时,预处理器只会将'F'替换为你在paranthesis中放入的任何内容