首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包装方法在'false‘块中结束,但直接函数调用不会

包装方法在'false‘块中结束,但直接函数调用不会
EN

Stack Overflow用户
提问于 2017-06-07 08:29:49
回答 1查看 35关注 0票数 0

注释:我来自于一个与/ PHP相关的背景,对C语言没有太多经验。

我目前正在编写一个PHP扩展,它需要检查是否加载了另一个模块,为此,我在整个扩展过程中复制和粘贴了以下代码片段:

代码语言:javascript
运行
复制
#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。这是我使用的方法:

代码语言:javascript
运行
复制
#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
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-07 08:42:11

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

代码语言:javascript
运行
复制
const char name[] = "hash";

而不是

代码语言:javascript
运行
复制
const char* name = "hash";

代码是错误的,因为sizeof()所做的事情与您想象中的不同。它返回其参数的实际存储大小,如果此参数是指针,则返回的大小是指针的大小,而不是它所指向的对象的大小。

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

示例:

代码语言:javascript
运行
复制
zend_bool extension_module_exists(const char* name)
{
    return zend_hash_str_exists(&module_registry, name, strlen(name));
}

注意,这有一些开销,因为strlen()必须扫描其参数以找到第一个0-byte,它在C中标记字符串的结尾。

尽管如此,您可能应该考虑重新构造模块,只检查另一个扩展,并将结果保存在变量中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44407439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档