首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重性与PERL_IMPLICIT_CONTEXT的关系

多重性与PERL_IMPLICIT_CONTEXT的关系
EN

Stack Overflow用户
提问于 2019-08-01 09:03:47
回答 1查看 261关注 0票数 0

Perl宏MULTIPLICITYPERL_IMPLICIT_CONTEXT之间有什么关系?

根据perlguts

一个宏控制着主要的Perl构建风格:MULTIPLICITYMULTIPLICITY构建有一个C结构,可以打包所有解释器状态。使用启用多重性的perls,PERL_IMPLICIT_CONTEXT通常也是定义的,并且支持传递一个“隐藏”的第一个参数,该参数表示所有三个数据结构。

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

我注意到当我用usethreads构建perl时

代码语言:javascript
复制
./Configure -des -Dusethreads

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

支持MULTIPLICITYPERL_IMPLICIT_CONTEXT的下列组合: 1)无 2)为兼容性支持的多重性# 3)多重性&& PERL_IMPLICIT_CONTEXT这些标志的所有其他组合都是错误。 只直接支持#3,而#2是#3的特例(通过适当地重新定义vTHX来支持)。

  • 所以,在编写XS代码时,编写#ifdef MULTIPLICITY和编写#ifdef PERL_IMPLICIT_CONTEXT有什么区别吗?
  • 这两个变量背后的历史是什么?现在看来他们可能会减少到一个人。例如,如果在perl源代码中将所有出现的MULTIPLICITY替换为PERL_IMPLICIT_CONTEXT,会发生什么情况?它会打破什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 20:42:23

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

  • 定义USE_ITHREADS的当且仅当Configure被赋予标志-Dusethreads时,例如: 配置-des -Dusethreads
  • 定义MULTIPLICITY的当且仅当Configure被赋予标志-Dusemultiplicity: 配置-des -Dusemultiplicity
  • 通过ccflags设置ccflags而不是config.h中设置MULTIPLICITY,例如: 配置-des -Accflags="-DMULTIPLICITY“
  • Configure没有用于PERL_IMPLICIT_CONTEXT-D标志,通过ccflagsccflags定义为而不是config.h中定义它。

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

代码语言:javascript
复制
#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_ITHREADSMULTIPLICITYPERL_IMPLICIT_CONTEXT都将被定义。
  • 如果给出-Dusemultiplicity,将定义MULTIPLICITYPERL_IMPLICIT_CONTEXT,而USE_ITHREADS则未定义。
  • 如果没有一个-Dusethreads-Dusemultiplicity被赋予USE_ITHREADSMULTIPLICITYPERL_IMPLICIT_CONTEXT,那么所有这些都将是未定义的。
  • 不可能定义MULTIPLICITY和未定义PERL_IMPLICIT_CONTEXT (除非使用ccflags,但这只能在perl构建过程中使用)。包含perl.h的XS扩展模块不会看到这一点)

因此,扩展模块通常可以假设:

  • MULTIPLICITYPERL_IMPLICIT_CONTEXT都是定义的,或者
  • MULTIPLICITYPERL_IMPLICIT_CONTEXT都是未定义的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57305409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档