Được rồi, vì vậy tôi có thể gọi hoạt động như fastcall CC, bằng cách khai báo với __attribute__((fastcall))
. Làm cách nào để xác định chính hàm đó là fastcall?Định nghĩa hàm fastcall GCC
Giống như, tôi có mã gọi:
// caller.c
unsigned long func(unsigned long i) __attribute__((fastcall));
void caller() {
register unsigned long i = 0;
while (i != 0xFFFFFFD0) {
i = func(i);
}
}
Và chức năng:
// func.c
unsigned long func(unsigned long i) {
return i++;
}
Trong mã này, func()
đang được biên soạn như cdecl, nó trích i từ ngăn xếp, không phải từ ecx (đây là i386).
Nếu tôi viết unsigned long func(unsigned long i) __attribute__((fastcall));
trong func.c nó chỉ sẽ không biên dịch, nói
error: expected ‘,’ or ‘;’ before ‘{’ token
Nếu tôi khai báo nó trong func.c giống như cách tôi đã làm trong caller.c, nó sẽ khiếu nại khác cách:
error: previous declaration of ‘func’ was here
func.c: 2: lỗi: mâu thuẫn loại cho ‘func’ func.c: 1: lỗi: khai trước của ‘func’ đã ở đây – einclude
@einclude thử đặt thuộc tính trước khi định nghĩa. phản hồi được cập nhật –
Cảm ơn bạn, đã hoạt động – einclude