好的,所以我可以通过声明来调用函数作为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);
}
}
Run Code Online (Sandbox Code Playgroud)
功能:
// func.c
unsigned long func(unsigned long i) {
return i++;
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,func()正在编译为cdecl,它从堆栈中提取i,而不是从ecx(这是i386)中提取i.
如果我unsigned long func(unsigned long i) __attribute__((fastcall));在func.c中写,它就不会编译,说
error: expected ‘,’ or ‘;’ before ‘{’ token
Run Code Online (Sandbox Code Playgroud)
如果我在func.c中以与我在caller.c中相同的方式声明它,它会以另一种方式抱怨:
error: previous declaration of ‘func’ was here
Run Code Online (Sandbox Code Playgroud)
必须在声明中应用属性,而不是在定义中应用.
尝试:
__attribute__((fastcall)) unsigned long func(unsigned long i) ;
__attribute__((fastcall)) unsigned long func(unsigned long i) {
return i++;
}
Run Code Online (Sandbox Code Playgroud)
执行此操作的标准方法是将声明放在标头中,并使两个源文件都包含标头