GCC fastcall功能定义

时间:2011-10-13 21:39:33

标签: c gcc

好的,我可以调用作为 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)。

如果我在func.c中写unsigned long func(unsigned long i) __attribute__((fastcall));,它就不会编译,说

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

如果我在func.c中以与我在caller.c中相同的方式声明它,它会以另一种方式抱怨:

error: previous declaration of ‘func’ was here

2 个答案:

答案 0 :(得分:8)

属性必须在声明中应用,而不是在定义中。

尝试:

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

执行此操作的标准方法是将声明放在标头中,并使两个源文件都包含标题

答案 1 :(得分:0)

问题是你在属性后面加上分号。你需要

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