gpt4 book ai didi

c - GCC 函数名冲突

转载 作者:太空狗 更新时间:2023-10-29 14:54:17 28 4
gpt4 key购买 nike

我在测试示例代码时遇到了一些问题,因为我的 abs 函数没有返回正确的结果。 abs(-2) 输出 -2(顺便说一句,如果不清楚的话,这应该是绝对值函数)

在有点绝望之后,我最终得到了以下代码

#include <stdio.h>

unsigned int abs(int x) {
return 1;
}

int main() {
printf("%d\n", abs(-2));
return 0;
}

这没有任何用处,但可以说明我的问题。当预期输出 1 时,它输出 -2。

如果我将函数名称更改为其他名称(例如 abs2),结果现在是正确的。此外,如果我将其更改为接收两个参数而不是一个参数,它也可以解决问题。

我的明显猜测:与标准 abs 函数冲突。但这仍然不能解释为什么输出是 -2(如果使用标准 abs 函数,它应该是 2)。我尝试检查两个版本的汇编输出(使用名为 abs 和 abs2 的函数)

这是两个程序集的差异输出:

23,25c23,25
< .globl abs
< .type abs, @function
< abs:
---
> .globl abs2
> .type abs2, @function
> abs2:
54c54
< .size abs, .-abs
---
> .size abs2, .-abs2
71c71,74
< movl -4(%rbp), %edx
---
> movl -4(%rbp), %eax
> movl %eax, %edi
> call abs2
> movl %eax, %edx

据我所知,第一个版本(函数名为 abs)只是放弃了函数调用,因此使用参数 x 而不是 abs(x)

所以总结一下:为什么会发生这种情况,特别是因为我找不到一种方法来获得关于此的任何类型的警告或错误。

在 Debian Squeeze、ggc 4.4.5 和 gcc 4.1.2 上测试

最佳答案

由于以下因素的相互作用,GCC 正在捉弄您:

  • abs 是内置函数;
  • 您正在声明 abs 返回 unsigned int 而标准(和内置)abs 返回 signed int

尝试用 gcc -fno-builtin 编译;在我的盒子上,它给出了 1 的预期结果。在没有该选项但使用 abs 声明为返回 signed int 的情况下进行编译会导致程序打印 2

(此问题的真正解决方案是不要为您自己的函数使用库标识符。另请注意,您不应使用 %d 打印 unsigned int .)

关于c - GCC 函数名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087706/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com