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

Wrapped method ends up in the 'false' block as but direct function call doesn't

注意:我来自 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

我决定将它放入它自己的方法中以使我的代码更干净,但是每当我这样做时,该方法似乎 return 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
}

有人可以指出我可能做错了什么吗? 谢谢。

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

const char name[] = "hash";

而不是

const char* name = "hash";

代码是错误的,因为 sizeof() 做了一些与您预期不同的事情。它returns它的参数的实际存储大小,如果这个参数是一个指针,返回的大小是指针的大小,而不是它指向的对象的大小.

对于字符串的长度,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 中字符串的结尾。


话虽这么说,您或许应该考虑将您的模块重组为仅一次检查其他扩展并将结果保存在变量中。