由于SWIG无法解析我想要包装的某些C结构上的__attribute__((packed))
,我通过放置
#define __attribute__(x)
在我的.i
文件中。
这会什么时候来咬我?
答案 0 :(得分:4)
这实际上是完全理智的。 SWIG不需要了解您要包装的struct
的布局,以便能够生成正确的代码。 (它甚至不需要知道它们包含的所有成员)。
这样做的原因是生成的代码主要是编组数据。在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的地方。你没事。