C 包装方法以'结束;假';块as,但直接函数调用不';T

C 包装方法以'结束;假';块as,但直接函数调用不';T,c,php-extension,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 lo

注意:我来自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
我决定将其放入自己的方法中,以使代码更加干净,但是每当我这样做时,该方法似乎返回
FALSE
NULL
。这是我正在使用的方法:

#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
}
有人能告诉我我可能做错了什么吗?
谢谢。

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

const char name[] = "hash";
而不是

const char* name = "hash";
代码是错误的,因为
sizeof()
所做的事情与您预期的不同。它返回其参数的实际存储大小,如果此参数是指针,则返回的大小是指针的大小,而不是它指向的对象的大小

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

例如:

zend_bool extension_module_exists(const char* name)
{
    return zend_hash_str_exists(&module_registry, name, strlen(name));
}
请注意,这会带来一些开销,因为
strlen()
必须扫描其参数以查找第一个
0
-字节,它在C中标记字符串的结尾



也就是说,您可能应该考虑重新构造模块,以便只检查一次其他扩展,并将结果保存在变量中。

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

const char name[] = "hash";
而不是

const char* name = "hash";
代码是错误的,因为
sizeof()
所做的事情与您预期的不同。它返回其参数的实际存储大小,如果此参数是指针,则返回的大小是指针的大小,而不是它指向的对象的大小

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

例如:

zend_bool extension_module_exists(const char* name)
{
    return zend_hash_str_exists(&module_registry, name, strlen(name));
}
请注意,这会带来一些开销,因为
strlen()
必须扫描其参数以查找第一个
0
-字节,它在C中标记字符串的结尾



话虽如此,您可能应该考虑重新构造模块,以便只检查一次其他扩展,并将结果保存在变量中。

最后是
sizeof()
调用,用
strlen()替换它,谢谢!最后是
sizeof()
调用,将其替换为
strlen()
成功了,谢谢!