6

由于 SWIG 无法解析__attribute__((packed))我想包装的某些 C 结构,因此我通过放置一个

#define __attribute__(x)

在我的.i档案中。

这什么时候会来咬我?

4

1 回答 1

5

这实际上是完全理智的。SWIG 不需要知道任何关于struct您要包装的 s 的布局,以便能够生成正确的代码。(它甚至不需要知道它们包含的所有成员)。

这样做的原因是生成的代码在很大程度上只是封送数据。在 C 中,您可以合法地编写:

void show_a(const struct foo *instance) {
  printf("%s", instance->b);
}

不管是否foo被定义为:

struct foo {
  double a;
  char *b;
}

或者

struct foo {
  char *b;
  double a,c;
  int xyz;
}

唯一需要打包/对齐的地方是创建新结构时。不过,这也可以正确处理,前提是您也不要对 C 编译器本身隐藏该属性,因为生成的 C 包装代码将使用真实定义,而不是您在接口文件中显示的伪定义。

这有点笨拙,但是您可以根据需要通过阅读生成的包装器来说服自己。

一般的答案是,您可以对 SWIG 本身撒谎很多,当 C 编译器看到生成的代码并将其与真实的定义/声明相协调时,最终一切都会好起来的。

在特定情况下,简短的回答是:只要您只将其#define放在 .i 文件中,然后仅放在它不会传递给您生成的 module_wrap.c 的地方,就可以了。

于 2013-07-26T20:43:38.857 回答