Хорошо, поэтому я могу вызвать функцию как fastcall CC, объявив ее с __attribute__((fastcall))
.
Как определить саму функцию как 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 , он извлекает i из стека, а не из ecx (это i386).
Если я напишу unsigned long func(unsigned long i) __attribute__((fastcall));
в func.c, он просто не скомпилируется со словами
error: expected ‘,’ or ‘;’ before ‘{’ token
Если я объявлю это в func.c так же, как я это сделал в caller.c, он будет жаловаться другим способом:
error: previous declaration of ‘func’ was here