GCC功能名称冲突

Nap*_*s62 5 c gcc

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

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

#include <stdio.h>

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

int main() {
    printf("%d\n", abs(-2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这没有任何用处,但它可以显示我的问题.当输出为1时,输出-2.

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

我明显的猜测:与标准abs功能发生冲突.但这仍然无法解释为什么输出为-2(如果使用标准abs函数则应为2).我试着检查两个版本的汇编输出(使用名为abs和abs2的函数)

这是两个组件的diff输出:

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
Run Code Online (Sandbox Code Playgroud)

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

总结一下:为什么会发生这种情况,特别是因为我无法找到任何方式来获得任何类型的警告或错误.

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

Fre*_*Foo 7

由于以下各方面的相互作用,海湾合作委员会正在玩弄你:

  • abs 是一个内置的功能;
  • 你宣布abs回归unsigned int,而标准的(内置)abs的回报signed int.

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

(这个问题的真正解决方案是不要将库标识符用于您自己的函数.另请注意,您不应该unsigned int使用%d.).