8

Perl から C++ コードを呼び出す方法を学んでおり、まず Perl スクリプトから基本的な C++ オブジェクトを作成しようとしています。

これを行うには、次のh2xsコマンドを実行することから始めました。

h2xs -A -nMyClass

次に、コンパイラMakefile.PLを使用するために、生成された に次の 2 つの引数を追加しました。g++

CC => 'g++',
LD => 'g++',

ファイルに単純なクラスを作成.xsし、Perl でマップする XS コードを記述しました。

MyClass.xs

#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifdef __cplusplus
}
#endif

class MyClass {
public:
    MyClass(int value) {
        value_ = value;
    }
    ~MyClass() {}

    int value() { return value_; }

    void set_value(int value) {
        value_ = value;
    }
private:
    int value_;
};

MODULE = MyClass                PACKAGE = MyClass

MyClass *
MyClass::new(int value)

void
MyClass::DESTROY()

int
MyClass::value()

void
MyClass::set_value(int value)

次に、新しい型を Perl にマップするための typemap ファイルを作成しました。

タイプマップ

TYPEMAP

MyClass *       O_OBJECT

######################################################################
OUTPUT

# The Perl object is blessed into 'CLASS', which should be a
# char* having the name of the package for the blessing.
O_OBJECT
        sv_setref_pv( $arg, CLASS, (void*)$var );

######################################################################
INPUT

O_OBJECT
        if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
                $var = ($type)SvIV((SV*)SvRV( $arg ));
        else{
                warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
                XSRETURN_UNDEF;
        }

最後に、簡単なテストを作成しました。

t/MyClass.t

use Test::More tests => 2;
BEGIN { use_ok('MyClass') };

my $obj = MyClass->new(1);
ok($obj->isa('MyClass'), 'MyClass object constructed');

その後、コードのビルドとテストの実行に成功しました。

perl Makefile.PL
make
make test

すべて正常に動作しますが、ビルドでいくつかの警告が表示されます。

MyClass.c: In function 'void XS_MyClass_new(PerlInterpreter*, CV*)':
MyClass.c:95: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_DESTROY(PerlInterpreter*, CV*)':
MyClass.c:119: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_value(PerlInterpreter*, CV*)':
MyClass.c:145: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_set_value(PerlInterpreter*, CV*)':
MyClass.c:174: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void boot_MyClass(PerlInterpreter*, CV*)':
MyClass.c:203: warning: unused variable 'Perl___notused'

これらの警告の原因を見つけようとしていたるところを検索しましたが、何が起こっているのかわかりません。すべての警告は、すべての関数定義の最初に発生するコード内の同じ繰り返しセクションから発生しているようです。

MyClass.c 内

XS(XS_MyClass_new); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyClass_new)
{
#ifdef dVAR
    dVAR; dXSARGS; // <-- warning occurs here
#else
    dXSARGS;
#endif
    // function body continues...

誰かがこれらの警告の根本的な原因を教えてもらえますか?

Perl v5.10.1 と g++ バージョン 4.4.7 を使用しています

4

1 に答える 1