0

I came across this code that I could not understand and could not find the answer anywhere:

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

What's the rule for syntax here? CMD_MAP(F) means passing those arguments to function F?

4

1 回答 1

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++ 的语法或句法一无所知。宏不必对函数调用或其他任何事情做任何事情,它们只是通过替换文本来工作。宏中有更多(黑暗)魔法,但这应该可以做到。

回到您的问题:预处理器只是用您在编写时放入括号内的任何内容替换“F”CMD_MAP(this here replaces F)

于 2013-06-24T18:30:14.307 回答