使用ExtUtils :: Constants访问系统常量

时间:2014-03-16 05:12:03

标签: perl xs

我尝试使用ExtUtils :: Constant从系统头导出C常量。

根据文档,我在Makefile.PL:

ExtUtils::Constant::WriteConstants (
    NAME => 'Foo::Bar',
    NAMES => [ qw(EPOLLIN EPOLLOUT) ]
);

然后在Bar.xs中:

 #include "const-c.inc"
 #include <sys/epoll.h>  // hail mary...

 MODULE = Foo::Bar    PACKAGE = Foo::Bar
 INCLUDE: const-xs.inc

但是,当我用:

运行测试时
 is(Foo::Bar::EPOLLOUT, 4);

我明白了:

t/bar.t Bareword "Foo::Bar::EPOLLOUT" not allowed while "strict subs" in use

如果EPOLLOUT作为常数存在,情况就不会如此;即它是无效的标识符。

这应该如何完成?我并不感到惊讶,因为未能将EPOLLOUT设置为正确的值 - 文档还说ExtUtils :: Constant&#34;不包含扫描头文件以提取这些常量的例程。 - 但是当生成的.xs代码超出我的想象时,我有点惊讶Foo :: Bar :: EPOLLOUT不被识别为具有undef值的标识符,并且它不是&#39;让我对接下来要尝试的内容感到困惑。

我会考虑使用ExtUtils :: Constant的另一个perl模块的源代码,但我能想到的唯一一个导出系统定义的是POSIX,它是核心(如果有人知道,请发表评论)。

24小时后:现在在Perl Monks 交叉发布。

1 个答案:

答案 0 :(得分:0)

您可能需要将常量称为函数Foo::Bar::EPOLLOUT()

ExtUtils :: Constant文档说它使用AUTOLOAD。要使裸字工作,需要将它们定义为“真实”常量。