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