内容

名称

ExtUtils::Constant - 生成 XS 代码以导入 C 头文件常量

概要

use ExtUtils::Constant qw (WriteConstants);
WriteConstants(
    NAME => 'Foo',
    NAMES => [qw(FOO BAR BAZ)],
);
# Generates wrapper code to make the values of the constants FOO BAR BAZ
#  available to perl

描述

ExtUtils::Constant 帮助生成 C 和 XS 包装代码,以允许 Perl 模块自动加载在 C 库头文件中定义的常量。它主要由 h2xs 实用程序使用,该实用程序基于此代码。它不包含用于扫描头文件以提取这些常量的例程。

用法

通常,只需要调用 WriteConstants 函数,然后

#include "const-c.inc"

Foo.xs 的 C 部分

INCLUDE: const-xs.inc

Foo.xs 的 XS 部分。

为了获得更大的灵活性,可以使用 `constant_types()`、`C_constant` 和 `XS_constant`,`WriteConstants` 是用它们实现的。

目前,该模块理解以下类型。h2xs 可能只知道其中的一部分。数值类型的尺寸由编译时的 `Configure` 脚本决定。

IV

有符号整数,至少 32 位。

UV

无符号整数,与 IV 大小相同。

NV

浮点类型,可能是 `double`,也可能是 `long double`。

PV

以 NUL 结尾的字符串,长度将使用 `strlen` 确定。

PVN

一个固定长度的东西,以 [指针,长度] 对的形式给出。如果你在编译时知道字符串的长度,你可以使用它来代替 PV

SV

一个 mortal SV。

YES

真值。 (PL_sv_yes) 不需要(也不使用)该值。

NO

定义的假值。 (PL_sv_no) 不需要(也不使用)该值。

UNDEF

undef。不需要宏的值。

FUNCTIONS

constant_types

一个返回单个标量的函数,其中包含用于在生成的 C 和 XS 函数之间内部使用的常量的 `#define` 定义。

XS_constant PACKAGE, TYPES, XS_SUBNAME, C_SUBNAME

一个用于生成 XS 代码的函数,以实现由 PACKAGE::AUTOLOAD 用于加载常量的 perl 子例程 PACKAGE::constant。此 XS 代码是围绕通常由 `C_constant` 生成的 C 子例程的包装器,通常命名为 `constant`。

TYPES 应该以逗号分隔的类型列表的形式给出,这些类型是 C 子例程 `constant` 将生成的,或者以对哈希的引用形式给出。它应该与 `C_constant` 给出的类型列表相同。[否则,`XS_constant` 和 `C_constant` 可能对传递给 C 函数 `constant` 的参数数量有不同的想法]

如果你给出参数 XS_SUBNAME,你可以将 perl 可见子例程命名为除 `constant` 之外的其他名称。它调用的 C 子例程默认为 perl 可见子例程的名称,除非你给出参数 C_SUBNAME

autoload PACKAGE, VERSION, AUTOLOADER

该函数用于为模块PACKAGE生成AUTOLOAD子例程,VERSION是代码应向后兼容的Perl版本。它默认为运行子例程的Perl版本。如果AUTOLOADER为真,则AUTOLOAD子例程将回退到AutoLoader::AUTOLOAD,用于constant()例程无法识别的所有名称。

WriteMakefileSnippet

WriteMakefileSnippet ATTRIBUTE => VALUE [, ...]

该函数用于生成Makefile.PL的Perl代码,该代码将重新生成常量子例程。参数以传递给WriteConstants的方式命名,并添加了INDENT以指定前导空格的数量(默认为2)。

目前仅识别INDENTNAMEDEFAULT_TYPENAMESC_FILEXS_FILE

WriteConstants ATTRIBUTE => VALUE [, ...]

编写一个C代码文件和一个XS代码文件,您应该在模块的XS代码的C部分和XS部分分别#includeINCLUDE它们。您可能希望在Makefile.PL中执行此操作,以便您可以轻松地编辑常量列表,而无需触碰模块的其余部分。支持的属性如下

NAME

模块的名称。必须指定此项。

DEFAULT_TYPE

常量的默认类型。如果未指定,则假定为IV

BREAKOUT_AT

常量的名称按长度分组。为每个组生成子例程,这些子例程包含此数量或更多名称。

NAMES

一个常量名称数组,可以是包含名称的标量,也可以是如"C_constant"中所述的哈希引用。

PROXYSUBS

如果为真,则使用代理子例程。请参阅ExtUtils::Constant::ProxySubs

C_FH

用于写入C代码的文件句柄。如果未给出,则打开C_FILE以进行写入。

C_FILE

包含C代码的要写入的文件的名称。默认值为const-c.inc。名称中的-确保该文件不会被误认为与合法Perl包名称相关的任何内容,并且不将文件命名为.c可以避免必须覆盖Makefile.PL的.xs.c规则。

XS_FH

用于写入 XS 代码的文件句柄。如果未给出,则将打开 XS_FILE 以供写入。

XS_FILE

包含 XS 代码的要写入的文件的名称。默认值为 const-xs.inc

XS_SUBNAME

生成的 XS 子例程的 Perl 可见名称,它将返回常量。默认值为 constant

C_SUBNAME

生成的 C 子例程的名称,它将返回常量。默认值为 XS_SUBNAME。子子例程具有 _ 和名称长度附加,因此具有 10 个字符名称的常量将在 constant_10 中,默认值为 XS_SUBNAME

AUTHOR

Nicholas Clark <[email protected]> 基于 Larry Wall 和其他人编写的 h2xs 中的代码