2013-08-02 22 views
0

我試圖從一些XS碼返回使用intptr_t類型: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,那麼我將把它串聯起來。

回答

2

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)做相反的操作。

+0

更新後的代碼可避免某些平臺上的虛假警告。 – ikegami

+0

嗡嗡聲,但你可能想要一些幸運的東西,所以你可以釋放你的對象。對不起,太累了挖掘如何做到這一點。 – ikegami

2

This thread提示:

現有機制,並處處工作是宏INT2PTRPTR2IV(在perl.h

perldoc perlguts

因爲指針大小不必須等於整數大小,請使用以下宏來正確執行。

PTR2UV(pointer) 
PTR2IV(pointer) 
PTR2NV(pointer) 
INT2PTR(pointertotype, integer) 
相關問題