【问题标题】:How to change the default calling convention in MinGW gcc如何更改 MinGW gcc 中的默认调用约定
【发布时间】:2015-09-18 04:18:35
【问题描述】:

在 Microsoft Visual C++ 中,可以使用 /Gz 编译器选项将默认调用约定设置为 stdcall。如何在 MinGW g++ 中做到这一点?

【问题讨论】:

    标签: mingw mingw32


    【解决方案1】:

    似乎是一个很好的方法来射击自己的脚;更好的是,IMO,将默认值明确保留为__cdecl,并明确声明__stdcall 函数,因此不会造成混淆。但是,如果您下定决心这样做,则可以从阅读 GCC 在线文档开始;尝试用谷歌搜索“gcc 手册”,它应该带你 (e.g.) here

    确保选择与您的 GCC 版本相匹配的手册版本,然后查阅“功能属性”部分;这应该将您指向-mrtd 选项作为您想要做的事情的可能候选人。在选项索引中查找它,然后按照参考来查看类似内容:

    -mrtd

    使用不同的函数调用约定,其中函数 采用固定数量的参数返回 ret num 指令,它在返回时弹出他们的参数。这节省了 调用者中的一条指令,因为不需要弹出 在那里争论。

    您可以使用函数属性“stdcall”指定使用此调用序列调用单个函数。你也可以 使用函数属性“cdecl”覆盖 -mrtd 选项。看 函数属性。

    警告:此调用约定与 Unix 上通常使用的不兼容,因此如果需要调用,则不能使用它 使用 Unix 编译器编译的库。

    此外,您必须为所有接受可变数量参数的函数(包括 printf)提供函数原型;除此以外 为调用这些函数生成了不正确的代码。

    此外,如果您调用具有太多参数的函数,则会导致代码严重错误。 (通常,额外的参数是 无害地忽略。)

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2021-12-20
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多