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

时间:2010-07-20 21:47:11

标签: c swig wrapping

我正在尝试使用其头文件通过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);

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

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

2 个答案:

答案 0 :(得分:2)

好的......最终了解了调用约定。问题是应该如何编写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);

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

答案 1 :(得分:1)

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