intptr_t的XS类型映射



我正试图从一些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执行相反的操作。

此线程建议:

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

来自perldoc perlguts:

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

PTR2UV(pointer)
PTR2IV(pointer)
PTR2NV(pointer)
INT2PTR(pointertotype, integer)

相关内容

  • 没有找到相关文章

最新更新