我有一个在屏幕上显示字符串的函数。原型是dispStrFont(char* str, struct Font font, int x, int y, int color)
然而,由于输入字体很烦人,我制作了一个宏#define dispStr(str, x, y, color) dispStrFont(str, normal_font, x, y, color)编译时工作正常(没有错误)。
我的琴弦大部分是黑色的,所以我不需要输入颜色所以我用另一个宏(放在上面一个宏的前面)来选择颜色:#define dispStr(str, x, y) dispStr(str, x, y, 0)
这两个宏的组合会产生错误,我不知道为什么。
头文件:

#define dispStr(str, x, y) dispStr(str, x, y, 0)
#define dispStr(str, x, y, color) dispStrFont(str, normal_font, x, y, color)
//the define above gives me a warning: "Incompatible redefinition of macro "dispStr" (declared at line 1)"

主文件:
dispStr("test", x, y) //gives me an error, saying there's an illegal token ')'
                      //also gives me a warning "Too few arguments in macro invocation"
dispStr("test", x, y, 0) //compiles fine

为什么会这样?另外,当我注释第二个定义时,它没有给我那个括号错误(但它显然没有编译,因为它无法识别dispStr函数),所以导致错误的是dispStr(str, x, y)上的连续定义。
编辑:最后修改宏以删除不必要的组合所以define dispStr(str, x, y) dispStr(str, x, y, 0)变成define dispStr(str, x, y) dispStrFont(str, normal_font, x, y, 0)。我还不得不把这个定义放在另一个之后,否则它仍然会因为某些原因给我括号错误。

最佳答案

不能重载宏。此外,如果宏已被调用,则不会再次调用。
您应该为宏指定不同的名称。您还可以使用variadic macro作为GNU扩展支持,并在C99以后使用。

关于c - C:连续宏不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37983441/

10-11 17:47