2011-10-13 38 views
5

Ok, posso chiamata funzione fastcall CC, dichiarandolo tramite __attribute__((fastcall)). Come si definisce la funzione stessa come chiamata rapida?GCC definizione della funzione fastcall

Come, non ho il codice chiamante:

// caller.c 

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

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

E la funzione:

// func.c 

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

In questo codice, func() viene compilato come cdecl, estrae i dalla pila, non da ecx (questo è i386).

Se scrivo unsigned long func(unsigned long i) __attribute__((fastcall)); in func.c semplicemente non compilare, dicendo

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

Se io dichiaro che nel func.c allo stesso modo ho fatto in caller.c, si lamenterà l'altro way:

error: previous declaration of ‘func’ was here 

risposta

8

Gli attributi devono essere applicati nella dichiarazione, non nella definizione.

Prova:

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

Il metodo standard per fare questo è quello di mettere la dichiarazione in un colpo di testa e hanno entrambi i file di origine includono l'intestazione

+0

func.c: 2: Errore: tipi contrastanti per ‘func’ func.c: 1: errore: precedente dichiarazione di ‘func’ era qui – einclude

+0

@einclude provare a mettere l'attributo prima della definizione. risposta aggiornata –

+0

Grazie, ha funzionato – einclude

0

Il problema è il punto e virgola si mette dopo l'attributo. È necessario

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