呼叫 C 並傳遞值 來源:John Lin
這和「如何從檔案讀出一個 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 函數。

小恐龍工作坊 提供