ExtUtils::Constant::Base - ExtUtils::Constant 对象的基类
require ExtUtils::Constant::Base;
@ISA = 'ExtUtils::Constant::Base';
ExtUtils::Constant::Base 提供了生成 C 代码的基类实现,以便通过命名字符串快速查找常量值。目前它主要用于 ExtUtils::Constant::XS,它为许多 XS 模块中找到的 constant() 子例程生成查找代码。
ExtUtils::Constant::Base 不导出任何子例程。以下方法可用
一个返回标量的方法,包含所需的定义,通常用于 C 头文件。
一个返回适合的 C if
语句的方法,用于检查name是否等于 C 变量name
。如果定义了checked_at,则使用它来避免对短名称使用memEQ
,或生成注释以突出显示switch
语句中字符的位置。
如果i<checked_at>是标量的引用,则它会给出在开头预先检查的字符(以及 C 变量名称已提前的字符数。这些需要从name的前面切除)。
一个内部函数,用于生成将重新生成常量子例程的嵌入式 perl 代码。default_type、types和ITEM与 C_constant 相同。indent被视为缩进的空格数。如果declare_types
为真,则在生成的 perl 代码中始终声明$types
,如果定义为假则从不声明,如果未定义,则仅当types中传递的值无法从default_types和ITEM中推断出来时才声明$types
。
一个返回适合的赋值子句的方法。如果type是聚合(例如PVN期望指针和长度),则应该有多个VALUE用于组件。如果定义了pre和post,则给出 C 代码片段以在赋值之前和之后执行。pre将在块的开头,因此可以在其中定义变量。
一个返回适合的#ifdef
子句的方法。ITEM是一个哈希引用(如传递给C_constant
和match_clause
)。indent是缩进的空格数,默认为 6。
一个内部方法,用于生成适合的switch
子句,由C_constant
调用。ITEM以C_constant
描述中给出的哈希引用格式给出,并且必须都具有相同长度的名称,由NAMELEN给出。ITEMHASH是对哈希的引用,以名称为键,值为ITEM列表中的哈希引用。(没有参数被修改,并且ITEMHASH中可以存在不在ITEM列表中的键,而不会导致问题 - 哈希被传递进来以节省为每次调用重新生成它)。
一个“内部”方法,可能会发生变化,目前被调用以允许覆盖类缓存信息,这些信息随后将被传递到所有*param*
调用中。(是的,必须阅读源代码才能理解这一点被认为是一个已知错误)。WHAT 是一个哈希引用,表示常量函数将返回的类型。在 ExtUtils::Constant::XS 中,此方法用于返回一个以 IV NV PV SV 为键的哈希引用,以显示在由 C_constant_other_params_definition 和 C_constant_other_params 生成的 C 参数列表中需要哪种指针组合。
一个内部函数,用于生成将重新生成常量子例程的嵌入式 Perl 代码。参数与 C_constant 相同。
目前,基类不做任何事情并返回一个空字符串。
将项目转换为规范形式。对于 8 位和 Unicode 值,将项目转换为包含 1 或 2 个项目的数组,这两个项目都以 8 位和 UTF-8 编码。
一个函数,返回一个列表,其中包含 C 子例程定义,这些定义在 XS 包装器传递名称时返回常量的值和类型。ITEM... 给出一个常量名称列表。每个名称可以是一个字符串,它被视为一个 C 宏名称,也可以是一个对哈希的引用,该哈希具有以下键
常量的名称,如 Perl 代码中所见。
常量的类型(IV、NV 等)
常量的值的 C 表达式,或者如果类型是聚合类型,则为 C 表达式的列表。如果没有给出,则默认为name。
在#ifdef
中使用的 C 预处理器宏。默认为name,主要用于value 是一个enum
时。如果传递了一个对数组的引用,则第一个元素用于代替#ifdef
行,第二个元素用于代替#endif
行。这允许使用以下预处理器结构
#if defined (foo)
#if !defined (bar)
...
#endif
#endif
用于确定是否要定义一个常量。
一个“macro” 1 表示常量始终被定义,因此省略#if
/#endif
测试。
如果宏未定义,则使用此默认值(而不是使用“您的供应商未定义...”进行croak
)作为返回值。指定一个包含类型和值(s)的数组的引用。
在为常量赋值之前使用的 C 代码。这允许您使用临时变量从struct
的一部分中提取值,并将其作为value返回。此 C 代码放置在块的开头,因此您可以在其中声明变量。
在为值(到临时变量)赋值和从函数返回之间放置的 C 代码。这允许您清除pre中的任何内容。很少需要。
pre和post的默认值等效项。
内部生成。如果名称是 7 位 ASCII,则为零或未定义,如果名称是 8 位(因此应该仅在 SvUTF8() 为假时匹配),则为“no”,如果名称是 utf8 编码,则为“yes”。
内部机制会自动将任何包含 128-255 字符但没有 256+ 字符(即可以是字节或 utf8 的字符)的名称克隆到第二个条目中,该条目是 utf8 编码的。
名称的可选排序权重,用于确定当多个名称落在 switch 子句的同一情况时线性测试的顺序。较高的权重排在前面,未定义的权重默认为零。
在参数 hashref 中,package 是包的名称,仅在生成的 C 代码中的注释中使用。subname 默认为constant
(如果未定义)。
default_type 是由未指定类型的 ITEM
返回的类型。它默认为 default_type()
的值。types 应该以 C 子例程 subname 将生成的类型的逗号分隔列表的形式给出,或者以对哈希的引用形式给出。如果 default_type 不存在,它将被添加到列表中,ITEM 列表中给出的任何类型也将被添加到列表中。生成的列表应该是 XS_constant
所给出的相同类型列表。[否则,XS_constant
和 C_constant
在常量函数的参数数量上可能会有所不同。indent 目前未使用且被忽略。将来它可能用于传递用于更改所用 C 缩进样式的信息。] 保持一致性的最佳方法是传递一个哈希引用,并让此函数更新它。
breakout 控制何时生成 subname 的子函数。如果有 breakout 个或更多个具有相同名称长度的 ITEM,则在它们之间切换的代码将被放置在一个名为 subname_len 的函数中,例如对于 5 个字符长的名称,则为 constant_5
。默认的 breakout 为 3。单个 ITEM
始终内联。
尚未记录所有内容。
可能还有其他错误。
Nicholas Clark <[email protected]> 基于 Larry Wall 和其他人编写的 h2xs
中的代码