Tôi đã gặp một số vấn đề với mã mẫu tôi đã thử nghiệm, vì hàm abs của tôi không trả lại kết quả chính xác. abs (-2) được outputing -2 (điều này, bằng cách này, là nghĩa vụ phải được hàm giá trị tuyệt đối, nếu đó là không rõ ràng)GCC tên hàm xung đột
Sau khi nhận được một chút tuyệt vọng, tôi cuối cùng đã có đoạn mã sau
#include <stdio.h>
unsigned int abs(int x) {
return 1;
}
int main() {
printf("%d\n", abs(-2));
return 0;
}
Điều này không có gì hữu ích nhưng nó phục vụ để hiển thị vấn đề của tôi. Đây là kết quả đầu ra -2, khi nó được mong đợi xuất ra 1.
nếu tôi thay đổi tên chức năng thành tên khác (ví dụ abs2), kết quả bây giờ là chính xác. Ngoài ra, nếu tôi thay đổi nó để nhận được hai đối số thay vì một, nó cũng sửa chữa vấn đề.
Đoán hiển nhiên của tôi: xung đột với chức năng abs standart. Nhưng điều này vẫn không giải thích tại sao đầu ra là -2 (nó phải là 2, nếu sử dụng chức năng abs standart). Tôi đã thử kiểm tra sản lượng lắp ráp của cả hai phiên bản (với các hàm có tên abs và abs2)
Dưới đây là đầu ra khác cho cả assemblys:
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
Từ những gì tôi hiểu, phiên bản đầu tiên (trong đó chức năng là tên là abs) chỉ đơn giản là loại bỏ các cuộc gọi chức năng, do đó bằng cách sử dụng tham số x thay vì abs (x)
Vì vậy, để tổng kết: tại sao điều này xảy ra, đặc biệt là vì tôi không thể tìm thấy một cách để có được bất kỳ loại cảnh báo hoặc lỗi về điều này.
Thử nghiệm trên Bóp Debian, GGC 4.4.5, và cũng trên gcc 4.1.2
đây là một ví dụ trong ideone http://ideone.com/YpnkE –