为什么Perl访问跨平台打包的结构不适用于SWIG?

时间:2014-06-12 16:10:06

标签: perl cross-platform swig pack

来自:

我的.i确实:

#define __attribute__(x)

然后使用%include来包含我的PACK()的跨平台定义:

#if defined(SWIG)
#define PACK(...) VA_ARGS
#elif defined(_MSC_VER)
#define PACK(__Decl__) __pragma(pack(push, 1)) __Decl__ __pragma(pack(pop))
#else // GCC
#define PACK(__Decl__) __Decl__ __attribute__ ((packed))
#endif

然后我的代码如下:

PACK(
typedef struct {
    uint8_t something;
    uint32_t more;
} ) aName;

对于PACK()宏的早期版本,我在typedef行上遇到了来自SWIG的语法错误。现在我已经过去了,但是在编译SWIG生成的.c文件时,我已经获得并设置了抱怨aName不存在的函数。消息类似于(已编辑):

libudr_perl_swig.c: In function '_wrap_aName_set':
libudr_perl_swig.c:2367:20: error: expected identifier or '(' before
'=' token libudr_perl_swig.c: In function '_wrap_aName_get':
libudr_perl_swig.c:2377:3: error: expected expression before 'aName'

SWIG似乎知道我的结构 - 它创建了访问函数 - 但是并没有公开它们以至于访问函数可以找到它。

在我开始构建这个跨平台之前 - 当它仍然只有Linux __attribute__ ((packed))时 - 它在SWIG中工作。它仍然适用于Linux。因此,似乎有一些关于SWIG对PACK()的解释存在缺陷。

旧方法产生了很多每字段代码,如:

XS(_wrap_aName_something_set) {
  {
    aName *arg1 = (aName *) 0 ;
...

新方法生成一些结构代码,如:

SWIGCLASS_STATIC int _wrap_aName_set(pTHX_ SV* sv, MAGIC * SWIGUNUSEDPARM(mg)) {
  MAGIC_PPERL
  {

我的PACK()(SWIG中应该是无操作的)为什么要这样做?

1 个答案:

答案 0 :(得分:0)

Google搜索“cpp标准可变参数宏”会导致http://en.wikipedia.org/wiki/Variadic_macro,其中...的扩展为__VA_ARGS__,而不是VA_ARGS(正如我在某处找到的那样)。当我将我的宏定义更改为:

#if defined(SWIG)
#define PACK(...) __VA_ARGS__
#elif defined(_MSC_VER)
#define PACK(__Decl__) __pragma(pack(push, 1)) __Decl__ __pragma(pack(pop))
#else // GCC
#define PACK(__Decl__) __Decl__ __attribute__ ((packed))
#endif

它有效。