忽略__attribute __((packed))在SWIG接口中始终是安全的吗?

Dav*_*ave 6 swig

由于SWIG无法解析__attribute__((packed))我想要包装的一些C结构,我通过放置一个来解决这个问题

#define __attribute__(x)
Run Code Online (Sandbox Code Playgroud)

在我的.i档案中.

什么时候会来咬我?

Fle*_*exo 5

这实际上是理智的。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的位置,就可以了。