[英]GCC function name conflict
我在测试示例代码时遇到了一些问题,因为我的 abs function 没有返回正确的结果。 abs(-2) 输出 -2(顺便说一句,如果不清楚的话,这应该是绝对值 function)
在有点绝望之后,我最终得到了以下代码
#include <stdio.h>
unsigned int abs(int x) {
return 1;
}
int main() {
printf("%d\n", abs(-2));
return 0;
}
这没有任何用处,但可以说明我的问题。 这是输出 -2,而预期为 output 1。
如果我将 function 名称更改为其他名称(例如 abs2),结果现在是正确的。 此外,如果我将其更改为接收两个 arguments 而不是一个,它也可以解决问题。
我明显的猜测:与标准 abs function 冲突。但这仍然不能解释为什么 output 是 -2(如果使用标准 abs 函数,它应该是 2)。 我尝试检查两个版本的程序集 output(function 名为 abs 和 abs2)
这是两个程序集的差异 output:
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
据我了解,第一个版本(其中 function 被命名为 abs)只是丢弃了 function 调用,因此使用参数 x 而不是 abs(x)
总结一下:为什么会发生这种情况,特别是因为我找不到一种方法来获得有关此的任何警告或错误。
在 Debian Squeeze、ggc 4.4.5 和 gcc 4.1.2 上测试
由于以下因素的相互作用,GCC 正在捉弄你:
abs
是内置的function;abs
返回unsigned int
而标准(和内置) abs
返回signed int
。 尝试使用gcc -fno-builtin
进行编译; 在我的盒子上,给出了1
的预期结果。 不使用该选项但将abs
声明为返回signed int
进行编译会导致程序打印2
。
(此问题的真正解决方案是不要为您自己的函数使用库标识符。另请注意,您不应该使用%d
打印unsigned int
。)
gcc
优化了对abs()
的调用以使用其内置的abs()
。 因此,如果您使用-fno-builtin
选项(或将abs()
定义为返回int
),您会注意到您得到了正确的结果。 根据这个(引用):
GCC 包含标准 C 库中许多函数的内置版本。 以 _ builtin为前缀的版本将始终被视为与 C 库 function 具有相同的含义,即使您指定了 -fno-builtin 选项。 (参见 C 方言选项)其中许多功能仅在某些情况下进行了优化; 如果它们在特定情况下没有优化,将发出对库 function 的调用。
如果你包含了stdlib.h
,它首先声明了abs()
,你会在编译时得到一个错误。
听起来很像这个错误,它来自 2007 年并已修复。
您当然应该尝试在没有 GCC 内在函数的情况下进行编译,即在编译时传递-fno-builtin
(或仅传递 -fno- -fno-builtin-abs
以仅删除abs()
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.