我正试图从一些XS代码返回一个intptr_t类型:
intptr_t
my_func( self )
myObjPtr self
CODE:
RETVAL = (intptr_t) self;
OUTPUT:
RETVAL
我的类型映射没有任何关于intptr_t
的内容,所以dmake
当然会在Could not find a typemap for C type 'intptr_t'.
中失败。我不确定Perl是否能处理像intptr_t
这样大的整数。如果没有好的方法将其作为数字返回给Perl,我只会字符串化它。
IV
,Perl的有符号整数格式,保证足够大,可以容纳一个指针。intptr_t
是Perl长期以来的C版本。(事实上,ref只是存储在标量的IV槽中的一个指针,带有指示它是引用的标志。)
但是您不希望直接转换为IV
,因为这可能会导致虚假的警告。正如SinanÜnür所指出的,使用PTR2IV
。
IV
my_func()
myObjPtr self
CODE:
self = ...;
RETVAL = PTR2IV(self);
OUTPUT:
RETVAL
CCD_ 9执行相反的操作。
此线程建议:
现有的在任何地方都有效的机制是宏
INT2PTR
和PTR2IV
(在perl.h
中)
来自perldoc perlguts:
因为指针大小不一定等于整数大小,所以请使用下面的宏来正确执行。
PTR2UV(pointer) PTR2IV(pointer) PTR2NV(pointer) INT2PTR(pointertotype, integer)