【问题标题】:SWIG errors because of preprocessor directive由于预处理器指令导致的 SWIG 错误
【发布时间】:2012-05-25 19:26:17
【问题描述】:

我们有一个供应商为我们提供了一个 C++ 库和头文件,我正在尝试使用 SWIG 对其进行包装。看来他们对预处理器指令太聪明了:

// top.h
#define DECLARE_WITH_COMMA(a) a,

然后

// foo.h
#include "top.h"

#define MY_TYPES(d) \
  d(One)   \
  d(Two)   \
  d(Three) \
  NumElems

enum MyTypes {
  MY_TYPES(DECLARE_WITH_COMMA)
};

这是一种冗长的说法,当我尝试在“foo.h”上运行 SWIG(版本 2.0.4)时,我得到:

foo.h:12: Error: Syntax error in input(1).

因此,鉴于我可能不想更改供应商提供的标头,我的问题是我的选择是什么?

【问题讨论】:

  • 第 84 行是什么?你能根据有问题的标题构建一个最小的测试用例,然后在这里发布吗?
  • 好的,上面的代码现在代表了一个完整的测试用例。

标签: swig c-preprocessor


【解决方案1】:

默认情况下,SWIG 不会递归到嵌套标题中,因此您的 .i 文件应如下所示:

%module mymod

%{
#include "foo.h"
%}

%include "top.h"
%include "foo.h"

还有一个 SWIG 开关:

-includeall     - Follow all #include statements

但如果您的系统标头可能超出您的预期。

【讨论】:

  • @MarkTolonen,如果top.h 有另一个头文件的#include 语句怎么办?我有这个问题。我尝试在我的 .i 文件中添加 %include 语句,但我得到了相同的语法错误。
  • @citizenSNIPS 继续为您需要处理的任何标头添加%include。 SWIG 不会递归。
  • 我发现在接口文件中添加%include <windows.i>可以解决这个问题。请参阅 swig 文档中的第 3.4 节 HERE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2015-07-09
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多