Perl XS未使用的变量'Perl___notused'警告

tjw*_*992 8 c++ perl g++ xs

我正在学习如何从Perl调用C++代码,并开始尝试从Perl脚本创建一个基本的C++对象.

为此,我开始执行h2xs命令:

h2xs -A -nMyClass

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

CC => 'g++',
LD => 'g++',
Run Code Online (Sandbox Code Playgroud)

我在.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)
Run Code Online (Sandbox Code Playgroud)

然后我创建了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;
        }
Run Code Online (Sandbox Code Playgroud)

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

吨/ MyClass.t

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

my $obj = MyClass->new(1);
ok($obj->isa('MyClass'), 'MyClass object constructed');
Run Code Online (Sandbox Code Playgroud)

然后我成功构建了代码并运行了测试.

perl Makefile.PL
make
make test
Run Code Online (Sandbox Code Playgroud)

虽然一切正常,但我对构建有一些警告:

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'
Run Code Online (Sandbox Code Playgroud)

我搜遍了所有试图找到这些警告的原因,并且无法弄清楚发生了什么.所有警告似乎都来自于每个函数定义开头的代码中的相同重复部分.

在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...
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我这些警告的根本原因吗?

我使用的是Perl v5.10.1和g ++版本4.4.7

tjw*_*992 1

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

我正在发布我自己问题的答案,因为它在评论中得到了回答,但从未发布过官方答案。