我遇到了一些問題,我正在測試一個示例代碼,因爲我的abs函數沒有返回正確的結果。 ABS(-2)的outputing -2(這,順便說一句,是suposed是絕對值函數,如果不清楚)GCC函數名稱衝突
變得有點絕望後,我終於有了下面的代碼
#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)
這裏的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
據我所知,第一個版本(其中功能命名爲abs)簡單地放棄函數調用,因此使用參數x而不是abs(x)
所以總結一下:爲什麼會發生這種情況,特別是因爲我找不到任何警告或有關此錯誤。
測試Debian的擠壓,GGC 4.4.5,並且還對GCC 4.1.2
這裏是ideone的一個例子http://ideone.com/YpnkE – 2012-04-10 11:22:07