由于 SWIG 无法解析__attribute__((packed))
我想包装的某些 C 结构,因此我通过放置一个
#define __attribute__(x)
在我的.i
档案中。
这什么时候会来咬我?
由于 SWIG 无法解析__attribute__((packed))
我想包装的某些 C 结构,因此我通过放置一个
#define __attribute__(x)
在我的.i
档案中。
这什么时候会来咬我?
这实际上是完全理智的。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 的地方,就可以了。