2011-10-13 16 views
5

bien, así que puede llamada función que fastcall CC, declarando con __attribute__((fastcall)). ¿Cómo se define la función en sí misma como llamada rápida?GCC función fastcall definición

igual, no tengo código de llamada:

// caller.c 

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

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

Y la función:

// func.c 

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

En este código, func() está siendo compilado como cdecl, extrae i de la pila, no desde ecx (esto es i386).

Si escribo unsigned long func(unsigned long i) __attribute__((fastcall)); en func.c simplemente no se compilará, diciendo

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

Si lo declaro en func.c la misma manera que lo hice en caller.c, se quejan de la otra manera:

error: previous declaration of ‘func’ was here 

Respuesta

8

Los atributos se deben aplicar en la declaración, no en la definición.

Probar:

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

La forma habitual de hacer esto es poner la declaración en una cabecera y tienen ambos archivos de origen incluyen la cabecera

+0

func.c: 2: Error: Conflicto en los tipos de ‘func’ func.c: 1: Error: previa declaración de ‘func’ fue aquí – einclude

+0

@einclude trate de poner el atributo antes de la definición. respuesta actualizada –

+0

Gracias, eso funcionó – einclude

0

El problema es el punto y coma se pone después del atributo. Es necesario

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