2011-10-13 67 views
5

好了,這樣我就可以通話功能FASTCALL CC,通過__attribute__((fastcall))宣佈它。 如何將函數本身定義爲fastcall?FASTCALL GCC函數定義

一樣,我有來電顯示功能的代碼:

// caller.c 

unsigned long func(unsigned long i) __attribute__((fastcall)); 

void caller() { 
    register unsigned long i = 0; 
    while (i != 0xFFFFFFD0) { 
     i = func(i); 
    } 
} 

而且功能:

// func.c 

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

在這段代碼,func()被編譯爲CDECL,它提取從堆棧,不是從ecx(這是i386)。

如果我寫在func.c它只是不會編譯unsigned long func(unsigned long i) __attribute__((fastcall));,說

error: expected ‘,’ or ‘;’ before ‘{’ token 

我若在func.c。我在caller.c做同樣的,它會抱怨其他方式:

error: previous declaration of ‘func’ was here 

回答

8

屬性必須應用在聲明中,而不是定義中。

嘗試:

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

標準的方式做,這是把聲明的頭,並有兩個源文件包含頭

+0

func.c:2:錯誤:衝突的類型「功能」 func.c:1:錯誤:「功能」的先前的聲明在這裏 – einclude

+0

@einclude嘗試把屬性定義之前。更新回覆 –

+0

謝謝,那確實有效 – einclude

0

問題是你的屬性後放置一個分號。您需要

unsigned long func(unsigned long i) __attribute__((fastcall)) // no semicolon here 
{ 
    ... function ...