Предупреждения о неиспользуемой переменной Perl XS Perl___notused

Я учусь тому, как вызывать код C ++ из Perl, и для начала пытаюсь создать базовый объект C ++ из сценария Perl.

Чтобы сделать это, я начал с выполнения h2xs команда:

h2xs -A -nMyClass

Затем я добавил следующие два аргумента в сгенерированный Makefile.PL использовать g++ компилятор.

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

Я создал свой простой класс в .xs файл и написал код XS для сопоставления его с Perl

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;
}

Наконец я создал простой тест.

т / 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

8

Решение

Решение состоит в том, чтобы использовать более новую версию Perl. v5.10.1 очень устарел, и эти проблемы не встречаются в более поздних версиях.

Я публикую ответ на свой вопрос, потому что он был дан в комментариях, но официальный ответ так и не был опубликован.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]