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

时间:2013-07-26 19:40:21

标签: swig

由于SWIG无法解析我想要包装的某些C结构上的__attribute__((packed)),我通过放置

来解决这个问题。
#define __attribute__(x)

在我的.i文件中。

这会什么时候来咬我?

1 个答案:

答案 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的地方。你没事。