【发布时间】:2023-03-13 05:05:01
【问题描述】:
所以我有一个与宏函数具有相同定义的函数,它们输出相同的值。为了确认这一点,我这样做了:
int a(int vertex, int offset) {
int value = vertex*numberOfoffsets + offset;
if (value != b(vertex, offset)) printf("error\n");
return value;
}
这是宏:
#define b(vertex, offset) (vertex*numberOfoffsets + offset) //EDIT: I had mta instead of b here (on the stackoverflow post)
请注意,numberOfOffsets 本身也是一个宏,它返回 6。
我使用a(vertex,offset) 运行算法,一切正常,没有打印error\n,这意味着两个函数返回相同的值。
但是当我使用b(vertex,offset) 而不是a(vertex,offset) 运行算法时,会出现错误的答案(尽管算法不会中断。
关于宏,我有什么遗漏的吗?他们不只是替换文本吗?我真的不明白这种行为。
编辑:对不起,我忘了更改函数的名称,b 现在是正确的(它是定义函数)
EDIT2:添加括号可以解决问题,因此应该是:
#define b(vertex, offset) (((vertex)*(numberOfoffsets)) + (offset))
但其他用户建议我改用内联函数,所以现在是:
static __inline__
int b(int vertex, int offset) {
return vertex*numberOfoffsets + offset;
}
【问题讨论】:
-
这里的
b是什么? -
请显示你所有的代码,
b。您从不使用 mta,因此它似乎无关紧要。您是在说“此代码给出了错误的答案”,但不显示代码、输入或答案 -
通常,您应该在宏定义中使用过多的括号,例如
#define mta(v,o,n) ((v)*(n) + (o)) -
宏不是函数。它仅在编译之前用其他内容替换文本内容。宏不返回任何内容。尽可能避免使用这种宏(几乎总是这样)。如果您想避免函数调用 - 请改用内联函数。宏容易出错并且很难调试
-
发布
numberOfoffsets的定义。