【问题标题】:GCC fastcall function definitionGCC fastcall 函数定义
【发布时间】:2011-10-13 21:39:33
【问题描述】:

好的,所以我可以 call 充当 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

【问题讨论】:

    标签: c gcc


    【解决方案1】:

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

    试试:

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

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

    【讨论】:

    • func.c:2:错误:'func' func.c:1 的类型冲突:错误:'func' 的先前声明在这里
    • @einclude 尝试将属性放在定义之前。更新回复
    【解决方案2】:

    问题出在属性后面的分号。你需要

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多