为什么具有不同调用约定的函数仍然可以相互调用?
Why can functions with different calling conventions still call each other?
int __cdecl funcB(int a, int b) {
return 0;
}
int __stdcall funcA(int a, int b) {
return funcA(a, b);
}
我写了这两个函数,它们有不同的调用约定:__stdcall
和 __cdecl
。
我的问题是为什么 MSVC 没有抛出编译错误?
因为在我看来两个调用约定不同的函数不能互相调用
如果调用者认为被调用者应该清理堆栈,而被调用者认为调用者应该清理堆栈,这就是我的问题
任何答案都会有所帮助
Because in my view two functions with different calling conventions can't call each other
这完全是错误的看法。调用约定只是一组关于如何在调用中处理参数的规则。编译器在每个调用点和函数体内生成指令,这些指令遵循定义函数的约定。
If caller think callee should clean the stack, and callee think caller should clean the stack, and that's my problem
你想到的问题是省略了调用约定,不同的翻译单元编译时默认的约定不同。一个 TU 中的声明以与另一个 TU 中的定义不兼容的方式使用。
int __cdecl funcB(int a, int b) {
return 0;
}
int __stdcall funcA(int a, int b) {
return funcA(a, b);
}
我写了这两个函数,它们有不同的调用约定:__stdcall
和 __cdecl
。
我的问题是为什么 MSVC 没有抛出编译错误?
因为在我看来两个调用约定不同的函数不能互相调用
如果调用者认为被调用者应该清理堆栈,而被调用者认为调用者应该清理堆栈,这就是我的问题
任何答案都会有所帮助
Because in my view two functions with different calling conventions can't call each other
这完全是错误的看法。调用约定只是一组关于如何在调用中处理参数的规则。编译器在每个调用点和函数体内生成指令,这些指令遵循定义函数的约定。
If caller think callee should clean the stack, and callee think caller should clean the stack, and that's my problem
你想到的问题是省略了调用约定,不同的翻译单元编译时默认的约定不同。一个 TU 中的声明以与另一个 TU 中的定义不兼容的方式使用。