2011-10-13 36 views
5

Đượ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 

Trả lời

8

Thuộc tính phải được áp dụng trong khai báo chứ không phải trong định nghĩa.

Hãy thử:

__attribute__((fastcall)) unsigned long func(unsigned long i) ; 
__attribute__((fastcall)) unsigned long func(unsigned long i) { 
    return i++; 
} 

Cách thông thường để làm điều này là để đưa tuyên bố trong một tiêu đề và có cả file nguồn bao gồm tiêu đề

+0

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

+0

@einclude thử đặt thuộc tính trước khi định nghĩa. phản hồi được cập nhật –

+0

Cảm ơn bạn, đã hoạt động – einclude

0

Vấn đề là các dấu chấm phẩy bạn đặt sau khi các thuộc tính. Bạn cần

unsigned long func(unsigned long i) __attribute__((fastcall)) // no semicolon here 
{ 
    ... function ... 
Các vấn đề liên quan