gpt4 book ai didi

c++ - OpenWatcom/VisualStudio 在重新调用约定方面的互操作性

转载 作者:行者123 更新时间:2023-11-28 04:27:50 26 4
gpt4 key购买 nike

我想用 OpenWatcom 编译一个 Photoshop Filter 插件。该代码已经存在并且可以与 Visual Studio 完美配合。

函数如下所示:

extern "C" __declspec(export) void PluginMain(short selector, FilterRecordPtr pb, intptr_t *data, short *result);

它在 Visual C++ 中完美运行。请注意,没有明确指定调用约定(Adobe 未在其 SDK 头文件中定义任何调用约定)。

虽然它在 VC++ 中工作,但在 OpenWatcom 中这不起作用,并且调用约定似乎不正确。 (即使使用“HelloWorld”函数,我也会出现奇怪的行为,例如堆栈损坏)。

在维基百科上,我查看了带有调用约定的表格:The table says如果未指定调用约定,Watcom 会将参数放入寄存器“EAX、EDX、EBX、ECX”,从右到左填充堆栈,然后被调用者清理堆栈。但是该表没有说明如果没有指定调用约定,Microsoft 编译器会做什么。我确实认为 Visual Studio 默认使用不同的调用约定。所以我尝试在 OpenWatcom 中指定 __stdcall__cdecl__pascal,但没有太大帮助。

我的一个问题是,如果未指定任何内容,Visual Studio 的默认调用约定到底是什么?究竟将什么放入寄存器,堆栈的哪个方向,谁清理堆栈?我在任何地方都找不到此信息。

如果我知道确切的行为,我也许可以使用 OpenWatcom 中的“#pragma aux”功能来强制执行自定义调用约定?

或者您知道我可以尝试修复 OpenWatcom 中的调用约定的其他方法吗?

最佳答案

(从评论中移出)

Visual C++ 中的默认调用约定是 cdecl , 尽管 it can be changed through a command-line switch (/Gd, /Gr, /Gv, /Gz) .

仔细阅读,似乎 Watcom 也有一组类似的选项 - -ecc 应该将其设置为默认使用 cdecl

关于c++ - OpenWatcom/VisualStudio 在重新调用约定方面的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com