例如,我看到源代码如下所示。我们可以在函数中使用#define吗?它怎麽工作?(更多信息:此代码是我从openvswitch源代码中复制的代码):
void *
ofputil_put_action(enum ofputil_action_code code, struct ofpbuf *buf)
{
switch (code) {
case OFPUTIL_ACTION_INVALID:
#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) case OFPUTIL_##ENUM:
#include "ofp-util.def"
OVS_NOT_REACHED();
#define OFPAT10_ACTION(ENUM, STRUCT, NAME) \
case OFPUTIL_##ENUM: return ofputil_put_##ENUM(buf);
#define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
case OFPUTIL_##ENUM: return ofputil_put_##ENUM(buf);
#define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
case OFPUTIL_##ENUM: return ofputil_put_##ENUM(buf);
#include "ofp-util.def"
}
OVS_NOT_REACHED();
}
#define OFPAT10_ACTION(ENUM, STRUCT, NAME) \
void \
ofputil_init_##ENUM(struct STRUCT *s) \
{ \
memset(s, 0, sizeof *s); \
s->type = htons(ENUM); \
s->len = htons(sizeof *s); \
} \
\
struct STRUCT * \
ofputil_put_##ENUM(struct ofpbuf *buf) \
{ \
struct STRUCT *s = ofpbuf_put_uninit(buf, sizeof *s); \
ofputil_init_##ENUM(s); \
return s; \
}
#define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
OFPAT10_ACTION(ENUM, STRUCT, NAME)
#define OFPAT13_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
OFPAT10_ACTION(ENUM, STRUCT, NAME)
#define NXAST_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME) \
void \
ofputil_init_##ENUM(struct STRUCT *s) \
{ \
memset(s, 0, sizeof *s); \
s->type = htons(OFPAT10_VENDOR); \
s->len = htons(sizeof *s); \
s->vendor = htonl(NX_VENDOR_ID); \
s->subtype = htons(ENUM); \
} \
\
struct STRUCT * \
ofputil_put_##ENUM(struct ofpbuf *buf) \
{ \
struct STRUCT *s = ofpbuf_put_uninit(buf, sizeof *s); \
ofputil_init_##ENUM(s); \
return s; \
}
#include "ofp-util.def"发布于 2016-05-01 15:53:39
#define 是一个预处理指令:它用于在将其处理到编译器生成可执行文件之前生成最终的C++代码。因此,代码如下:
for(int i = 0; i < 54; i++) {
#define BUFFER_SIZE 1024
}not执行54次(在预处理器级别):预处理器只是在for循环上运行(不知道for循环是什么),看到定义语句,将1024与BUFFER_SIZE关联起来,然后继续。直到它到达文件的底部。
您可以在任何地方编写#define,因为预处理器并不真正了解程序本身。
发布于 2016-05-01 15:47:01
当然这是可能的。在编译器做任何事情之前,#define由预处理程序处理。这是一个简单的文本替换。预处理器甚至不知道代码行是在函数、类或其他函数的内部还是外部。
顺便说一句,在C++中定义预处理器宏通常被认为是不好的风格。使用模板可以更好地实现它们的大部分用途。
发布于 2016-05-01 15:50:17
您可以在函数中使用它,但它的作用域不限于该函数。因此,在您的示例中,宏的第二个定义将是重新定义并生成错误。您需要首先使用#undef来清除它们。
https://stackoverflow.com/questions/36968567
复制相似问题