我可以为SWIG库定义void吗?

3

我正在尝试使用SWIG为一个我无法控制源代码的库生成Python接口模块。这个库,由于某些原因,有这样一行代码:

#define VOID void

这会给SWIG带来各种问题;它似乎认为VOID是这些函数将返回的实际对象。

有没有办法告诉SWIG,VOID表示void


1
该库可能是为了与不支持void关键字的ANSI C编译器一起使用而设计的;对于这样的编译器,它可能有#define VOID int#define VOID /* nothing */。但这并没有回答你的问题。 - Keith Thompson
你说你无法控制库的源代码,但你有头文件。我认为你应该能够在头文件中将VOID重命名为其他名称(例如:void),这样就可以解决问题了,不是吗? - piokuc
perl -p -i -e s/VOID/void/ * - piokuc
@piokuc 这可能是一个选项,但我不是仓库中唯一使用这些头文件的人,编辑它们是我的最后选择。 - Woodrow Douglass
好的,你可以复制它,只是为了创建SWIG绑定... - piokuc
2个回答

1
当我创建 SWIG 接口文件时,我完全复制了函数原型,包括 VOID。如果我将接口文件中所有原型从使用 VOID 改为使用 void,问题就解决了。
看来 SWIG 确实尊重预处理器,只是对自己的接口文件不生效,这是可以理解的。
将此发布在这里供以后的搜索者参考...

0

等一下...如果你没有这个库的源代码,我假设你的意思是#define VOID void发生在一个头文件(.H)中,你正在包含它来使用这个库。如果库已经编译好了,那么#define VOID void不会影响它,并且只与那些头文件有关。#define指令只影响您的预处理器,它编译您的代码(库已经构建好了)。所以,如果只有那些头文件使用VOID,那么请确保在这些头文件中,顶部有一个#define VOID void,底部有一个#undef VOID来删除VOID宏。


问题是,我认为 SWIG 没有尊重预处理器。VOID 实际上在头文件中定义得非常早。 - Woodrow Douglass
同一个头文件的其他部分可能依赖于#define VOID void的定义。 - martineau
我的意思是,只在头文件中定义VOID宏。在每个头文件的顶部定义它,在底部取消定义。预处理器以相当线性的方式遍历文件,并执行此操作应该使VOID仅对库的头文件有意义,并且不会继续破坏您代码中的其他内容。如果这行不通,那么我想强制将VOID替换为void也是一个选择。 - Alex
SWIG在什么情况下不会"尊重"预处理器呢? - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接