由于SWIG无法解析__attribute__((packed))我想要包装的一些C结构,我通过放置一个来解决这个问题
#define __attribute__(x)
Run Code Online (Sandbox Code Playgroud)
在我的.i档案中.
什么时候会来咬我?
这实际上是理智的。SWIG不需要了解所有struct要包装的s 的布局即可生成正确的代码。(甚至甚至不需要知道它们包含的所有成员)。
其原因是所生成的代码在很大程度上只是封送数据。在C中,您可以合法地编写:
void show_a(const struct foo *instance) {
printf("%s", instance->b);
}
Run Code Online (Sandbox Code Playgroud)
不论是否foo定义为:
struct foo {
double a;
char *b;
}
Run Code Online (Sandbox Code Playgroud)
要么
struct foo {
char *b;
double a,c;
int xyz;
}
Run Code Online (Sandbox Code Playgroud)
打包/对齐很重要的唯一地方是创建新结构时。但是,如果您也不要从C编译器本身隐藏该属性,则也可以正确处理此问题,因为生成的C包装器代码将使用真实定义,而不是您在接口文件中显示的伪定义。
这有点笨拙,但是您可以通读生成的包装器,根据需要说服自己。
普遍的答案是,您可能对SWIG本身有很多谎言,最后当C编译器看到生成的代码并将其与实际的定义/声明进行协调时,一切都会顺利进行。
在特定情况下,简短的答案是:只要您仅将其#define放在.i文件中,然后仅在不将其传递到生成的module_wrap.c的位置,就可以了。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |