2011-10-13 8 views
5

わかりまし定義なので、私はできコール__attribute__((fastcall))でそれを宣言することにより、fastcall CCとして機能。 ファンクション自体をファストコールとして定義するにはどうすればよいですか?GCC fastcall関数

// 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));を記述する場合、それはちょうど私がfunc.cに私がcaller.cで行ったのと同じ方法でそれを宣言した場合、それは他に文句を言うでしょう

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

を言って、コンパイルされませんway:

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を必要とする「FUNC」の前の宣言は、定義の前に属性を入れてみてください@eincludeここ – einclude

+0

ました。更新された応答 –

+0

ありがとうございました。 – einclude

0

問題は、あなたが属性の後に置くセミコロンを含めることです。 2:エラー:1:エラー:「FUNC」 func.cのための相反するタイプのあなたは

unsigned long func(unsigned long i) __attribute__((fastcall)) // no semicolon here 
{ 
    ... function ... 
関連する問題