【发布时间】:2015-09-18 04:18:35
【问题描述】:
在 Microsoft Visual C++ 中,可以使用 /Gz 编译器选项将默认调用约定设置为 stdcall。如何在 MinGW g++ 中做到这一点?
【问题讨论】:
在 Microsoft Visual C++ 中,可以使用 /Gz 编译器选项将默认调用约定设置为 stdcall。如何在 MinGW g++ 中做到这一点?
【问题讨论】:
似乎是一个很好的方法来射击自己的脚;更好的是,IMO,将默认值明确保留为__cdecl,并明确声明__stdcall 函数,因此不会造成混淆。但是,如果您下定决心这样做,则可以从阅读 GCC 在线文档开始;尝试用谷歌搜索“gcc 手册”,它应该带你 (e.g.) here。
确保选择与您的 GCC 版本相匹配的手册版本,然后查阅“功能属性”部分;这应该将您指向-mrtd 选项作为您想要做的事情的可能候选人。在选项索引中查找它,然后按照参考来查看类似内容:
-mrtd
使用不同的函数调用约定,其中函数 采用固定数量的参数返回 ret num 指令,它在返回时弹出他们的参数。这节省了 调用者中的一条指令,因为不需要弹出 在那里争论。
您可以使用函数属性“stdcall”指定使用此调用序列调用单个函数。你也可以 使用函数属性“cdecl”覆盖 -mrtd 选项。看 函数属性。
警告:此调用约定与 Unix 上通常使用的不兼容,因此如果需要调用,则不能使用它 使用 Unix 编译器编译的库。
此外,您必须为所有接受可变数量参数的函数(包括 printf)提供函数原型;除此以外 为调用这些函数生成了不正确的代码。
此外,如果您调用具有太多参数的函数,则会导致代码严重错误。 (通常,额外的参数是 无害地忽略。)
【讨论】: