1

我试图从一些 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 是否能处理尽可能大的整数intptr_t。如果没有很好的方法将它作为数字返回给 Perl,我将把它字符串化。

4

2 回答 2

3

该线程建议:

在任何地方都有效的现有机制是宏INT2PTRPTR2IV(in perl.h)

来自perldoc perlguts

因为指针大小不一定等于整数大小,所以使用下面的宏来做正确的事。

PTR2UV(pointer)
PTR2IV(pointer)
PTR2NV(pointer)
INT2PTR(pointertotype, integer)
于 2013-08-02T02:31:38.270 回答
3

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

INT2PTR(myObjPtr, iv)进行逆运算。

于 2013-08-02T02:39:46.283 回答