【问题标题】:Can i #define void for a swig library?我可以为 swig 库#define void 吗?
【发布时间】:2013-02-12 16:40:01
【问题描述】:

我正在尝试使用 SWIG 为我无法控制其来源的库生成 python 接口模块。出于某种原因,图书馆有这行:

#define VOID void

这会导致 SWIG 出现各种问题;似乎认为 VOID 是这些函数将返回的实际对象。

我有什么办法可以告诉 SWIG VOID 的意思是 void

【问题讨论】:

  • 该库可能设计用于不支持 void 关键字的 pre-ANSI C 编译器;对于这样的编译器,它可能有#define VOID int#define VOID /* nothing */。不过,这并不能回答您的问题。
  • 你说你无法控制库的来源,但你有标题。我认为您应该能够在标题中将 VOID 重命名为其他名称(也许:void),它应该可以解决问题,不是吗?
  • perl -p -i -e s/VOID/void/ *
  • @piokuc 这可能是一个选项,但我不是唯一在这个存储库中使用这些标题的人,编辑它们是我宁愿不练习的最后手段。
  • 好吧,您可以复制它只是为了创建 SWIG 绑定...

标签: python c swig


【解决方案1】:

当我创建我的 SWIG 接口文件时,我逐字复制了函数原型 VOID 等等。如果我将接口文件中的所有原型从使用VOID 更改为使用void,问题就消失了。

似乎 SWIG 确实尊重预处理器,只是不是因为它自己的接口文件,这是可以理解的。

在此处发布此内容以供将来的搜索者使用...

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 问题是,我不认为 SWIG 尊重预处理器。 VOID 实际上在标题中很早就定义了。
    • 同一个头文件的其他部分可能依赖于#define VOID void定义。
    • 我的意思是,使 VOID 宏只在标题中定义。在每个标题的顶部,定义它,在底部,取消定义它。预处理器以相当线性的方式遍历文件,这样做应该使 VOID 只对库的标题有意义,并且不会继续搞砸代码中的其他内容。如果那不可行,那么我想将 VOID 硬替换为 void 始终是一种选择。
    • SWIG 如何不“尊重”预处理器?
    猜你喜欢
    • 2017-06-25
    • 2021-09-25
    • 2021-02-02
    • 2019-02-16
    • 2012-08-12
    • 2015-01-10
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多