這和「如何從檔案讀出一個 struct」或「如何寫入一個 struct 到檔案中」是類似的
可以用 pack/unpack 來做。例如:
struct s { char name[16]; char addr[16]; int age };
的 pack/unpack pattern 是 'Z16 Z16 i' 那麼利用
------------------------------------------------------- call.pl
use ExtUtils::testlib;
use MyXsTest;
my $struct = pack('Z16 Z16 i','John Lin','Taipei',33);
MyXsTest::call($struct);
可以把這個 struct 帶下去給 XS
------------------------------------------------------- MyXsTest.xs
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
MODULE = MyXsTest PACKAGE = MyXsTest
void
call(param)
char* param
CODE:
struct s { char name[16]; char addr[16]; int age; } *p;
p = (struct s*) param;
printf("Name: %s\nAddr: %s\n Age: %d\n",p->name,p->addr,p->age);
結果
Name: John Lin
Addr: Taipei
Age: 33
其實一般來說,XS 只是用來當 glue code,直接傳 struct 給 C 的機會較少
(當然傳 Perl 的 LoL 機會更少),通常是傳基本型態 long, char* 等參數
void
call(name,addr,age)
char* name
char* addr
int age
再扮演橋樑的角色,把它們組成合適的資料傳給真正要呼叫的 C 函數。