Определение функции GCC fastcall - PullRequest
5 голосов
/ 14 октября 2011

Хорошо, поэтому я могу вызвать функцию как 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

Ответы [ 2 ]

8 голосов
/ 14 октября 2011

Атрибуты должны применяться в объявлении, а не в определении.

Попробуйте:

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

Стандартный способ сделать это - поместить объявление в заголовок и иметь обаисходные файлы включают заголовок

0 голосов
/ 14 октября 2011

Проблема в том, что вы ставите точку с запятой после атрибута.Вам нужно

unsigned long func(unsigned long i) __attribute__((fastcall)) // no semicolon here
{
    ... function ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...