由于 ZEND_NUM_ARGS() 宏而无法构建扩展

Posted

技术标签:

【中文标题】由于 ZEND_NUM_ARGS() 宏而无法构建扩展【英文标题】:Fail to build extension due to ZEND_NUM_ARGS() macros 【发布时间】:2012-08-13 21:41:55 【问题描述】:

我正在编写小型 php 扩展程序,但在构建时遇到了问题。 代码:

PHP_RINIT_FUNCTION(pstat)

    int argc = ZEND_NUM_ARGS();
    return SUCCESS;

在 make 时出错:

.... /ext/pstat/pstat.c:122:31: error: 'ht' undeclared (first use in this function)

ZEND_NUM_ARGS() 是 Zend_API.h 中的一个宏

#define ZEND_NUM_ARGS()     (ht)

但是什么是'ht'?有什么想法吗?

【问题讨论】:

【参考方案1】:

你为什么在这里使用ZEND_NUM_ARGS()?这是请求初始化函数,不会接收任何用户提供的参数。


通常但并非总是如此,ht 用于表示哈希表。

ZEND_NUM_ARGS() 通常在使用PHP_FUNCTION 宏定义的函数中使用,以获取从 PHP 脚本传递给内部函数的参数数量。


如果您从 PHP_FUNCTION 宏回溯,您最终会看到在内部函数定义中使用的以下标准参数集。

#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC

如您所见,此定义包含 ht 作为 int。

PHP_RINIT_FUNCTION 的参数不包括 ht

#define INIT_FUNC_ARGS      int type, int module_number TSRMLS_DC

【讨论】:

我想将每个请求的开始时间保存到 php。我虽然 PHP_RINIT_FUNCTION 是个好主意。 好的,那你需要ZEND_NUM_ARGS做什么? 我虽然有一些要求的论据。例如脚本名称。现在我明白它是我的游戏的错误位置。

以上是关于由于 ZEND_NUM_ARGS() 宏而无法构建扩展的主要内容,如果未能解决你的问题,请参考以下文章

渲染 Jinja2 宏而不影响模板其余部分的内容

在macro_rules中使用另一个宏而不需要生锈的“extern crate”

python 这是一个小型的演示,我们用它来了解上下文管理器如何在python中工作,显然它们的工作更像是宏而不是fu

由于缺少 KIF 类,项目无法构建

由于未安装包轮,因此无法构建***

此代码是不是由于编译器错误而无法构建?