1

MULTIPLICITYPerl API 宏和之间有什么关系PERL_IMPLICIT_CONTEXT

根据perlguts

一个宏控制主要的 Perl 构建风格:MULTIPLICITY. 该 MULTIPLICITY构建具有一个 C 结构,用于打包所有解释器状态。对于启用多重性的 perls,PERL_IMPLICIT_CONTEXT通常也进行了定义,并启用了对传入表示所有三种数据结构的“隐藏”第一个参数的支持。

(顺便问一下,这里指的是哪一个“三种数据结构”?)

我注意到,当我使用以下命令构建 perl 时usethreads

./Configure -des -Dusethreads

PERL_IMPLICIT_CONTEXTMULTIPLICITY都将被设置(定义)。此外,embedvar.h还有一条可能相关的评论:

MULTIPLICITY支持和 的以下组合PERL_IMPLICIT_CONTEXT
1) 无
2) MULTIPLICITY # 支持兼容性
3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT

这些标志的所有其他组合都是错误的。

只有#3 被直接支持,而#2 是#3 的特例(通过适当地重新定义 vTHX 来支持)。

  • 那么,在编写 XS 代码时,写 #ifdef MULTIPLICITY和写有什么区别#ifdef PERL_IMPLICIT_CONTEXT吗?

  • 这两个变量背后的历史是什么?似乎他们今天可以减少到一个单一的。例如,如果在 perl 源代码中将所有出现的MULTIPLICITY替换为会发生什么?PERL_IMPLICIT_CONTEXT它会破坏什么?

4

1 回答 1

1

这是我到目前为止发现的。运行sh Configure -des创建标题config.h。该头文件将:

  • 定义USE_ITHREADS当且仅当Configure被赋予标志-Dusethreads,例如:

    sh Configure -des -Dusethreads
    
  • 定义MULTIPLICITY当且仅当Configure被赋予标志-Dusemultiplicity

    sh Configure -des -Dusemultiplicity
    
  • 设置MULTIPLICITY通过ccflags不会设置MULTIPLICITY例如config.h

    sh Configure -des -Accflags="-DMULTIPLICITY"
    
  • Configure没有-D的标志PERL_IMPLICIT_CONTEXT,通过定义它ccflags不会中定义它config.h

生成的config.h标头是#included by perl.h。请注意,后一个标头通常也包含在 Perl XS 扩展文件 ( .xs-files) 中。在第 59 行,perl.h我们有:

#ifdef USE_ITHREADS  
#  if !defined(MULTIPLICITY)
#    define MULTIPLICITY
#  endif
#endif

#ifdef PERL_GLOBAL_STRUCT_PRIVATE
#  ifndef PERL_GLOBAL_STRUCT
#    define PERL_GLOBAL_STRUCT
#  endif
#endif

#ifdef PERL_GLOBAL_STRUCT
#  ifndef MULTIPLICITY
#    define MULTIPLICITY
#  endif
#endif

#ifdef MULTIPLICITY
#  ifndef PERL_IMPLICIT_CONTEXT
#    define PERL_IMPLICIT_CONTEXT
#  endif
#endif

这意味着:

  • 如果-Dusethreads给定,USE_ITHREADSMULTIPLICITY, 和PERL_IMPLICIT_CONTEXT都将被定义。

  • if-Dusemultiplicity是给定的,MULTIPLICITY并且PERL_IMPLICIT_CONTEXT将被定义,而USE_ITHREADS将是未定义的。

  • 如果没有给出or -Dusethreads,,和都将是未定义的。-DusemultiplicityUSE_ITHREADSMULTIPLICITYPERL_IMPLICIT_CONTEXT

  • 不可能有已MULTIPLICITY定义和PERL_IMPLICIT_CONTEXT未定义(除非使用ccflags,但这只会在 perl 构建期间。包含的 XS 扩展模块perl.h不会看到这个)

所以扩展模块通常可以假设:

  • MULTIPLICITY并且PERL_IMPLICIT_CONTEXT都被定义,或者
  • MULTIPLICITY并且PERL_IMPLICIT_CONTEXT都是未定义的。
于 2019-08-01T20:42:23.370 回答