c - 使用多个 if/else if 语句定义函数宏的预处理器指令

标签 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,只是没有结构、指针或声明新数据类型的能力。因此,我不得不求助于预处理器指令以实现某种形式的虚函数(当我不知道我正在使用的窗口类型 - 图像、超链接等时使用)。

最佳答案

试一试:

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

关于c - 使用多个 if/else if 语句定义函数宏的预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666828/

相关文章:

c - 直接返回地址时出现段错误,但通过指针返回地址时没有错误

c - 为什么 C 名称被缩短?

c - 如何在编译时检查 liblua 版本?

c++ - 使用GCC对C文件进行部分预处理(不删除 “define”指令)

c++ - 一个宏,用于提取其输入文本的字符并使用它们生成代码

c++ - 欺骗 ARM 连接器将功能代码放入某些数据存储器中

c - 宏语法困惑

c - 用 C 宏替换部分函数/变量名

从包装宏内调用 Malloc

c# - 在 C# 中检查空指针