C宏函数具有与等效普通函数相同的输出,但算法具有不同的输出

用户名

所以我有一个与宏函数具有相同定义的函数,并且它们输出相同的值。为了确认这一点,我这样做:

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,offset7调用之前。但是宏使用double进行数学运算,并且int通过将赋值将答案转换resultB

是否需要对此做任何事情还有待商de。但是,要使该宏与该函数完全等效,可以将其编写为

#define b(vertex, offset) ((int)((int)(vertex) * 6 + (int)(offset)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个连续相同的回声调用在Vim函数中具有不同的输出

为什么两个函数给出具有相同方法的不同输出?

为什么 subStr(charArr, 0, strlen(charArr)) 和 charArr 在使用 printf 时具有相同的输出但在传递给函数时具有不同的输出?

具有多列输出的postgresql函数

不同的函数如何具有相同的名称?

如何在Swift中将具有多个输出的函数的输出分配给不同的变量?

Flask api每次使用具有不同api输入参数的函数调用都返回相同的输出

如何在两个具有不同输出类型的相同Haskell函数中删除代码重复?

如何使用具有相同键但值类型不同的输入和输出对象来键入函数?

对具有不同输出的不同路线使用相同的组件

Matlab Polyval函数,具有与Python / Numpy等效的三个输出

类似函数的宏和枚举器具有相同的名称

在R中,函数seq(1,10)和seq(1:10)具有相同的输出,为什么函数mean(1,10)和mean(1:10)具有不同的输出?

具有相同逆变换的不同图像输出

接近相同功能的Arduino,具有非常不同的输出

显然相同的数学表达式具有不同的输出

在具有相同键的不同数组中输出值

具有不同表达式的Lambda返回相同的输出

将dplyr包中的do()替换为具有相同输出的新函数

以相同的名称调用不同的函数,具有相同的动作

具有不同返回类型的C ++函数

Javascript vs python:具有两个递归分支的函数的不同输出

在机器学习中多次具有相同的输入(具有不同的输出)是否可以接受?

具有随机值的两个不同类具有相同的输出

从具有相同输入和输出数量的另一个函数中调用一个函数

具有可变输入/输出类型的通用函数

用sympy对具有符号输出的函数求和

具有多个输出绑定的Azure函数-Blob和HTTP

定义具有多个无法组织成矩阵的输出的函数