在 SWIG 接口中忽略 __attribute__((packed)) 总是安全的吗?

2024-03-28

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

#define __attribute__(x)

in my .i file.

这东西什么时候才会来咬我?


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

原因是生成的代码很大程度上只是编组数据。在 C 中你可以合法地写:

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

不管是否foo被定义为:

struct foo {
  double a;
  char *b;
}

or

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

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

它有点笨拙,但是您可以通过阅读生成的包装器来说服自己相信这一点。

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

在具体情况下,简短的答案是:只要你只把它#define在 .i 文件中,然后仅在它不会传递到生成的 module_wrap.c 的地方,就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SWIG 接口中忽略 __attribute__((packed)) 总是安全的吗? 的相关文章

随机推荐