我正在尝试使用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“不包含扫描头文件以提取这些常量的例程”-但是.xs代码Foo :: Bar :: EPOLLOUT未被识别为具有undef值的标识符,但事实并非如此,这让我感到困惑,因为我对下一步尝试感到困惑。

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

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

最佳答案

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

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

关于perl - 使用ExtUtils::Constants访问系统常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22433226/

10-16 11:44