3

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 モジュールのソースを検討しますが、exports システムが定義する唯一のものは POSIX であり、これがコアです (他の誰かが知っている場合はコメントを残してください)。

24 時間後: Perl Monksに相互投稿されました

4

1 に答える 1

0

おそらく、定数を関数として参照する必要がありますFoo::Bar::EPOLLOUT()

ExtUtils::Constant のドキュメントには、AUTOLOAD を使用していると書かれています。ベアワードを機能させるには、それらを「実際の」定数として定義する必要があります。

于 2014-03-19T22:51:04.660 に答える