代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

Perl XS未使用变量“Perl\uuu notused”警告

  •  8
  • tjwrona1992  · 技术社区  · 7 年前

    我正在学习如何从Perl调用C++代码,首先,我试图从Perl脚本创建一个基本的C++对象。

    为此,我首先执行 h2xs 命令:

    h2xs -A -nMyClass

    然后,我将以下两个参数添加到生成的 Makefile.PL g++ 编译器。

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

    我在 .xs 文件并编写XS代码,用Perl将其映射

    我的班级。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)
    

    然后我创建了typemap文件,将新类型映射到Perl。

    类型映射

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

    最后,我创建了一个简单的测试。

    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版本

    1 回复  |  直到 7 年前
        1
  •  1
  •   tjwrona1992    7 年前

    解决方案是使用较新版本的Perl。v5.10.1非常过时,这些问题在以后的版本中不会出现。