删除 FAR 可能会将所有模块限制在同一段内。如果这是一个小程序,这可能没问题。
编辑: 然而,FAR 是过去的遗物,不适用于 win32 目标,并且在大多数情况下可以安全删除。
更改调用约定,只会影响与调用这些方法的外部模块的可能互操作。 (它也可能对性能产生最小影响,尽管我什至不确定)。
编辑:但是哇...! 不!无法完成,我没有注意到这是针对 WinAPI 方法的,即当调用约定很容易为您定义时的一种方法...... FAR 可能也是如此,它可能是需要的。
次日编辑,以及 OP 的其他详细信息
目标函数在windef.h中定义为
extern "C" int APIENTRY Send (LPCSTR sCmd)
windef.h 支持非常多的操作系统、编译器版本和本地定义的值,[相当足够] 是一个组合逻辑练习。对于大多数 [非 MAC] 路径,并假设 windef.h 在该区域中相对不变,APIENTRY 归结为
...
#define APIENTRY WINAPI
...
#define WINAPI __stdcall
并且由于对于相同的路径,PASCAL 还产生__stdcall 第一个“谜”已解决,在这个特定的上下文中(即通常非 MAC、MSC 编译器 8.0 或更高版本(或定义_STDCALL_SUPPORTED 的编译器... )
关于 FAR 或什么都没有,(对我来说)不太清楚,但是,windef.h 宏中的大多数路径导致这两个宏什么都不产生。我认为这是因为编译器会使用目标内存模型来确定什么是短指针和长指针。无论如何,目标原型使用 LPCSTR,即“远/长”指针,这可能是编译器产生的。同样,对于函数本身使用的 FAR 修饰符,这也没有必要,因为编译器会根据内存模型和/或隐式地为远调用存根。
所以,上面解释了为什么,是的,所做的更改从 PASCAL 到 __stdcall 和从 FAR 到什么都没有都可以,应该会产生一个功能二进制。 (如果您更改编译器和/或目标操作系统,可能会重新检查等)。
感谢您提出这个问题,因为这促使我重新审视我有一段时间没有看到的问题。