我正在尝试从某些XS代码返回intptr_t类型:
intptr_t
my_func( self )
myObjPtr self
CODE:
RETVAL = (intptr_t) self;
OUTPUT:
RETVAL
我的typemap没有关于intptr_t
的任何内容,所以当然dmake
失败了Could not find a typemap for C type 'intptr_t'.
我不确定Perl是否适用于与{{1}一样大的整数} 可。如果没有好的方法将它作为一个数字返回给Perl,我只是将它字符串化。
答案 0 :(得分:2)
This thread建议:
在任何地方都能运作的现有机制是宏
INT2PTR
和PTR2IV
(在perl.h
)
因为指针大小不一定等于整数大小,所以使用跟随宏来正确执行。
PTR2UV(pointer) PTR2IV(pointer) PTR2NV(pointer) INT2PTR(pointertotype, integer)
答案 1 :(得分:2)
IV
,Perl的有符号整数格式,保证足够大以容纳指针。 intptr_t
是Per的长期存在的C版本。 (实际上,ref只是一个存储在标量IV槽中的指针,带有一个标志,表明它是一个引用。)
但是你不想直接投射到IV
,因为这会导致虚假警告。正如SinanÜnür所指出的,改为使用PTR2IV
。
IV
my_func()
myObjPtr self
CODE:
self = ...;
RETVAL = PTR2IV(self);
OUTPUT:
RETVAL
INT2PTR(myObjPtr, iv)
执行逆操作。