Wrapped方法最终出现在'false'块中,但直接函数调用不会

时间:2017-06-07 08:29:50

标签: c php-extension

注意:我来自Python / PHP相关背景,对C没有太多经验。

我正在编写一个PHP扩展,需要检查是否加载了另一个模块,为此我已经在我的扩展中复制并粘贴了以下代码片段:

#include "php.h"

const char* name = "hash";

if (zend_hash_str_exists(&module_registry, name, sizeof(name) - 1)) {
    return; // Doesn't end up here, module is loaded
}

// Returns true and thus ends up here

我决定将它放入自己的方法中,以使我的代码更加干净,但每当我这样做时,该方法似乎返回FALSENULL。这是我正在使用的方法:

#include "php.h"

zend_bool extension_module_exists(const char* name)
{
    return zend_hash_str_exists(&module_registry, name, sizeof(name) - 1);
}

const char* name = "hash";

if (extension_module_exists(name) == false) {
    return; // Now I end up here
}

有人可以告诉我我可能做错了什么吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

我认为您的第一个版本也不起作用,如此处所示。你有机会

const char name[] = "hash";

而不是

const char* name = "hash";

代码错误,因为sizeof()执行的操作与您预期的不同。它返回其参数的实际存储大小,如果此参数是指针,则返回的大小是指针的大小,而不是它指向的对象的大小。

对于字符串的长度,strlen()中有string.h函数,您应该使用此函数而不是sizeof()

示例:

zend_bool extension_module_exists(const char* name)
{
    return zend_hash_str_exists(&module_registry, name, strlen(name));
}

请注意,这会带来一点开销,因为strlen()必须扫描其参数以找到第一个0字节,该字节标记C中字符串的结尾。

话虽这么说,您应该考虑将模块重构为仅一次检查另一个扩展并将结果保存在变量中。