intptr_t的XS typemap

时间:2013-08-02 02:10:13

标签: perl intptr xs

我正在尝试从某些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,我只是将它字符串化。

2 个答案:

答案 0 :(得分:2)

This thread建议:

  

在任何地方都能运作的现有机制是宏INT2PTRPTR2IV(在perl.h

来自perldoc perlguts

  

因为指针大小不一定等于整数大小,所以使用跟随宏来正确执行。

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)执行逆操作。