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

tjwrona1992 спросил: 13 октября 2017 в 07:26 в: c++

Я учусь тому, как вызывать код 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
}
#endifclass 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 = MyClassMyClass *
MyClass::new(int value)void
MyClass::DESTROY()int
MyClass::value()void
MyClass::set_value(int value)

Затем я создал файл карты типов для сопоставления нового типа с Perl.

карта типов

TYPEMAPMyClass *       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 );######################################################################
INPUTO_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

0 ответов