来自:
我的.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中应该是无操作的)为什么要这样做?
答案 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
它有效。