所以我有一个与宏函数具有相同定义的函数,并且它们输出相同的值。为了确认这一点,我这样做:
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现在是正确的(它是define函数)
EDIT2:添加括号可解决此问题,因此应为:
#define b(vertex, offset) (((vertex)*(numberOfoffsets)) + (offset))
但是其他用户建议我改用内联函数,所以现在是:
static __inline__
int b(int vertex, int offset) {
return vertex*numberOfoffsets + offset;
}
通常,在宏定义中应使用过多的括号,例如
#define b(vertex, offset) ((vertex) * 6 + (offset))
否则,运算符优先级可能会将结果更改为意外的结果。例如,使用
int x = 4;
int y = b(x+1, 3);
应该与相同y = 5 * 6 + 3 = 33
。但是,不带括号的结果是
y = 4 + 1*6 + 3 = 13
。
@jxh在注释中指出了宏和函数之间的另一个区别。
当int
调用带有参数的函数并且参数不是类型时int
,编译器将隐式将参数转换为int
。但是,使用宏时,不会进行此类转换。
例如,代码
#define b(vertex, offset) ((vertex) * 6 + (offset))
int a(int vertex, int offset)
{
return vertex * 6 + offset;
}
int main(void)
{
double vertex = 3.3;
double offset = 7.4;
int resultA = a(vertex, offset);
int resultB = b(vertex, offset);
printf("%d %d\n", resultA, resultB);
}
将打印25 27
。这是因为编译器转换vertex
为3,offset
以7
调用之前。但是宏使用double
值进行数学运算,并且int
通过将赋值将答案转换为resultB
。
是否需要对此做任何事情还有待商de。但是,要使该宏与该函数完全等效,可以将其编写为
#define b(vertex, offset) ((int)((int)(vertex) * 6 + (int)(offset)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句