2016-11-23 5 views
7

私はperlグローバル変数(この場合は$ data)にインラインC関数からアクセスしようとしていますが、私が使った "data"変数は定義されていません。 どのようにすればいいですか?インラインC言語のperl変数へのアクセス

おかげ

次のコードスニペットは、変数「データ」が宣言されていないことを訴えてエラーになります。

$data = "this is a test"; 
test(); 

use Inline C => <<'END_OF_C_CODE'; 

void test() { 
    printf("here: %s\n", SvPV(data, PL_na)); 
} 

END_OF_C_CODE 

答えて

5

インライン/ XSコードでグローバル変数にアクセスするget_sv(又はget_av/get_hv)マクロを使用します。それが存在しない場合

package main; 
use Inline C; 
our $Bar = 123; 
test(); 
__DATA__ 
__C__ 
void test() { 
    SV* var = get_sv("Bar", GV_ADD); 
    const char *val = SvPVutf8_nolen(var); 
    printf("Value of $Bar is %s", val); 
} 

GV_ADDフラグ変数を作成(及びundefに初期化)します。存在しない変数にアクセスし、このフラグを使用しない場合、get_svNULLを返します。

あなたが探している変数がmain異なるパッケージ内にある場合、あなたはget_svコールでそれを修飾する必要があります。

package Foo; 
use Inline C; 
our $Bar = 123; 
test(); 
__DATA__ 
__C__ 
void test() { 
    SV* var = get_sv("Foo::Bar", GV_ADD); /* need "Foo::" now */ 
    const char *val = SvPVutf8_nolen(var); 
    printf("Value of $Foo::Bar is %s", val); 
} 

これはperlgutsに記載されています。

+0

正確な答えは@mobです。 – packetie

関連する問題