Perl宏MULTIPLICITY和PERL_IMPLICIT_CONTEXT之间有什么关系?
根据perlguts
一个宏控制着主要的Perl构建风格:
MULTIPLICITY。MULTIPLICITY构建有一个C结构,可以打包所有解释器状态。使用启用多重性的perls,PERL_IMPLICIT_CONTEXT通常也是定义的,并且支持传递一个“隐藏”的第一个参数,该参数表示所有三个数据结构。
(顺便问一下,这里提到的“三个数据结构”是哪一个?)
我注意到当我用usethreads构建perl时
./Configure -des -Dusethreads宏PERL_IMPLICIT_CONTEXT和MULTIPLICITY都将被设置(定义)。此外,在embedvar.h中有一个可能相关的评论:
支持
MULTIPLICITY和PERL_IMPLICIT_CONTEXT的下列组合: 1)无 2)为兼容性支持的多重性# 3)多重性&& PERL_IMPLICIT_CONTEXT这些标志的所有其他组合都是错误。 只直接支持#3,而#2是#3的特例(通过适当地重新定义vTHX来支持)。
#ifdef MULTIPLICITY和编写#ifdef PERL_IMPLICIT_CONTEXT有什么区别吗?MULTIPLICITY替换为PERL_IMPLICIT_CONTEXT,会发生什么情况?它会打破什么?发布于 2019-08-01 20:42:23
这是我到目前为止所发现的。运行sh Configure -des将创建标题config.h。这个头文件将:
USE_ITHREADS的当且仅当Configure被赋予标志-Dusethreads时,例如:
配置-des -DusethreadsMULTIPLICITY的当且仅当Configure被赋予标志-Dusemultiplicity:
配置-des -Dusemultiplicityccflags设置ccflags将而不是在config.h中设置MULTIPLICITY,例如:
配置-des -Accflags="-DMULTIPLICITY“Configure没有用于PERL_IMPLICIT_CONTEXT的-D标志,通过ccflags将ccflags定义为而不是在config.h中定义它。生成的config.h头是由perl.h生成的#included。注意,Perl扩展名文件(.xs-files)通常也包含后一个头。在perl.h的第59行,我们有:
#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_ITHREADS、MULTIPLICITY和PERL_IMPLICIT_CONTEXT都将被定义。-Dusemultiplicity,将定义MULTIPLICITY和PERL_IMPLICIT_CONTEXT,而USE_ITHREADS则未定义。-Dusethreads或-Dusemultiplicity被赋予USE_ITHREADS、MULTIPLICITY和PERL_IMPLICIT_CONTEXT,那么所有这些都将是未定义的。MULTIPLICITY和未定义PERL_IMPLICIT_CONTEXT (除非使用ccflags,但这只能在perl构建过程中使用)。包含perl.h的XS扩展模块不会看到这一点)因此,扩展模块通常可以假设:
MULTIPLICITY和PERL_IMPLICIT_CONTEXT都是定义的,或者MULTIPLICITY和PERL_IMPLICIT_CONTEXT都是未定义的。https://stackoverflow.com/questions/57305409
复制相似问题