是否可以在函数内使用#define?

pen*_* xu 16 c c++

例如,我看到像流动的源代码.我们可以#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"
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 23

#define 是一个预处理程序指令:它用于生成最终的C++代码,然后将其处理到将生成可执行文件的编译器.因此代码如下:

for(int i = 0; i < 54; i++) {
  #define BUFFER_SIZE 1024
}
Run Code Online (Sandbox Code Playgroud)

不是执行54次(预处理器级):预处理简单地运行在for环(不知道个什么for环路),看到一个明确说法,联营1024BUFFER_SIZE和继续.直到它到达文件的底部.

你可以#define随处写,因为预处理器并不真正了解程序本身.


Fra*_*fer 8

当然这是可能的.该#define由编译器做任何事情之前,预处理器处理.这是一个简单的文本替换.预处理器甚至不知道代码行是在函数,类或其他内部还是外部.

顺便说一下,在C++中定义预处理器宏通常被认为是不好的风格.使用模板可以更好地实现大多数用于它们的东西.


DrC*_*DrC 7

您可以在函数内部使用它,但它的作用域不限于该函数。因此,在您的示例中,宏的第二个定义将是重新定义并生成错误。您需要#undef先使用来清除它们。