为什么具有不同调用约定的函数仍然可以相互调用?

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 中的定义不兼容的方式使用。