函数类型“extern __declspec(dllimport)INT __cdecl”在C / C ++或SWIG中是否有意义?

我试图通过SWIG使用其头文件包装DLL。 使用SWIG处理我的接口.i文件时出现语法错误。 在追踪违规行(SWIG错误消息打印的行号与真正的违规行不匹配)之后,我发现最小的不可处理的SWIG接口文件是:

/* example.i */ %module example %{ extern __declspec(dllimport) INT __cdecl function(int argument); %} extern __declspec(dllimport) INT __cdecl function(int argument); 

原型tern extern __declspec(dllimport) INT __cdecl function(int argument); 是从我试图包装的头文件中获取的。

这种类型声明了数十个函数。 正如你所看到的,我没有足够的C经验来判断这种类型是否有意义。 头文件来自供应商,使用Visual C ++ 6编译好。有人可以澄清一下吗?

好的…最终了解了调用约定。 问题是如何编写SWIG接口文件。

 /* example.i */ %module example %{ int __cdecl foo(void); // function declarations for the function int __stdcall foo2(void); // you intend to wrap goes in here %} int foo(void); // function you want to wrap goes in here int foo2(void); // without the calling convention 

在要包装的函数所在的区域中,不应包含调用约定修饰符(__cdecl,__ stdcall等)。 但我不想手动删除调用约定修饰符,特别是因为我不想修改我试图包装的头文件(想象一下,供应商发布新的和不兼容的头文件版本,我将不得不修改头文件一遍又一遍)。 一个解决方案是#define调用约定修饰符,SWIG已经提供了一个包含这个#define’tions的文件,即“windows.i”。 您必须在包含包含要包装的函数的标头之前包含它。 像这样:

 /* example.i */ %module example %{ #include "example.h" %} %include "windows.i" %include "example.h" 

哪里

 /* example.h */ int __cdecl foo(void); int __stdcall foo2(void); 

我只是不明白为什么它默认不这样做。 但我很满意我发现的东西。 谢谢各位指点……

只是INT跳出来就像麻烦一样。 这是一个宏,你需要像#include 来定义它。 除了普通的int之外,它不太可能是其他任何东西。 “extern”是多余的,任何编译器都会忽略它。