【问题标题】:Why can functions with different calling conventions still call each other?为什么具有不同调用约定的函数仍然可以相互调用?
【发布时间】:2021-09-20 10:28:01
【问题描述】:
int __cdecl funcB(int a, int b) {

    return 0;
}

int __stdcall funcA(int a, int b) {

    return funcA(a, b);
}

我编写了这两个函数,它们有不同的调用约定:__stdcall__cdecl

我的问题是为什么 MSVC 没有抛出编译错误?

因为在我看来,两个调用约定不同的函数不能互相调用

如果调用者认为被调用者应该清理堆栈,而被调用者认为调用者应该清理堆栈,那就是我的问题

任何答案都会有所帮助

【问题讨论】:

  • 你的观点是基于什么?为什么会出现错误?
  • 我看没问题,编译器拥有做正确事情所需的所有信息。并不是您将 funcB 称为 __stdcall。
  • @463035818_is_not_a_number 如果调用者认为被调用者应该清理堆栈,而被调用者认为调用者应该清理堆栈,那就是我的问题
  • 我认为你在重新输入时破坏了你的例子。
  • @Suric 函数什么都没想;创建调用的是编译器,它(显然)知道如何处理每个约定。

标签: c++ calling-convention function-call


【解决方案1】:

因为在我看来,两个调用约定不同的函数不能互相调用

这只是一个错误的观点。调用约定只是一组关于如何在调用中处理参数的规则。编译器会在每个调用点和函数体内生成指令,这些指令遵循定义函数的约定。

如果调用者认为被调用者应该清理堆栈,而被调用者认为调用者应该清理堆栈,那就是我的问题

您正在考虑的问题是调用约定被省略时,不同的翻译单元使用不同的默认约定进行编译。一个 TU 中的声明的使用方式与另一个 TU 中的定义不兼容。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多