预处理程序指令使用多个if / else if语句定义函数宏

时间:2012-10-01 02:17:44

标签: c c-preprocessor

我正在使用预处理程序指令在C中定义函数宏。我可以在函数宏中使用多个if / else if语句吗?

如果是,我该怎么写?

#define WRITE(str,id) #str(id)

// HERES where I am having difficulty
#define DRAW_GENERIC_WINDOW(windowID, type) if type==1 WRITE(draw_text,windowID) else if type==2 WRITE(draw_image,windowID) else if type==3 WRITE(draw_hyperlink,windowID)

// usage
DRAW_GENERIC_WINDOW(112, 1);
DRAW_GENERIC_WINDOW(178, 2);
DRAW_GENERIC_WINDOW(988, 3);

// At compile time the above should be converted to...
draw_text(112);
draw_image(178);
draw_hyperlink(988);

我知道如何在函数宏中执行单个if else语句,但不知道如何使用多个if / else if来执行它:

// if else eg
#define DRAW_GENERIC_WINDOW(windowID, type) ((type)==(1))?WRITE(draw_text,windowID):WRITE(draw_image,windowID)

注意:在你问“为什么你这么编程?”之前:P因为我使用的语言与C语言非常相似,称为4dm,除了没有结构,指针或声明新数据类型的能力。所以我不得不求助于预处理程序指令以实现某种形式的虚函数(当我不知道窗口的类型时使用 - 我正在使用的图像,超链接等)。

2 个答案:

答案 0 :(得分:3)

尝试这样:

#define WRITE(str,id) str(id)

// HERES where I am having difficulty
#define DRAW_GENERIC_WINDOW(windowID, type) if (type==1) \
WRITE(draw_text,windowID) \
else if (type==2) \
WRITE(draw_image,windowID) \
else if (type==3) \
WRITE(draw_hyperlink,windowID)

// usage
DRAW_GENERIC_WINDOW(112, 1);
DRAW_GENERIC_WINDOW(178, 2);
DRAW_GENERIC_WINDOW(988, 3);

答案 1 :(得分:1)

只需使用令牌粘贴操作符##作为基本模式匹配,如下所示:

#define DRAW_GENERIC_WINDOW(windowID, type) DRAW_GENERIC_WINDOW_ ## type(windowID)

#define DRAW_GENERIC_WINDOW_1 draw_text
#define DRAW_GENERIC_WINDOW_2 draw_image
#define DRAW_GENERIC_WINDOW_3 draw_hyperlink

然后像这样使用它:

DRAW_GENERIC_WINDOW(112, 1); // expands to draw_text(112, 1);
DRAW_GENERIC_WINDOW(178, 2); // expands to draw_image(178);
DRAW_GENERIC_WINDOW(988, 3); // expands to draw_hyperlink(988);