gpt4 book ai didi

c - 获取任意数据的函数 : Use void* or char*?

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:50 27 4
gpt4 key购买 nike

我最近用 C 为 LevelDB 编写了一个包装器,偶然发现了以下问题。将数据存储在数据库中的 LevelDB 函数如下所示:

leveldb_put(leveldb_t* db, const leveldb_writeoptions_t* options, const char* key, size_t keylen, const char* val, size_t vallen, char** errptr);

对于键和值,他们使用char*。这意味着我必须转换不是 char 指针的参数。这种情况经常发生,因为我经常将结构存储在数据库中。

考虑到这一点后,我决定在我的包装函数中使用 void* 作为键和数据。然后它看起来像这样:

int db_put(db_t db, void *key, size_t keylen, void *value, size_t valuelen)
{
char *k = (char*)key;
char *v = (char*)value;

/* Call leveldb_put() here with k and v as parameters. */

return 0;
}

这样我就不必将传递给 db_put() 函数的参数进行强制转换。我认为这个解决方案更优雅,但我想 LevelDB 在选择 char 指针时知道他们在做什么。

是否有理由不使用 void* 将任意数据传递给函数?

最佳答案

Is there a reason not to use void* to pass arbitrary data to a function?

没有。事实上,void * 存在 以方便传递任意数据而不需要丑陋的转换。这就是 ptr-to-void 被标准化的原因。至少在 C 中。 C++ 是另一种野兽。

在 LevelDB,他们必须处理带有 char * 的历史代码,或 C89 之前的编译器,或任何其他导致重构惯性的隐藏原因。他们的代码同样适用于 ptrs-to-void。

请注意,在您的 db_put 版本中,应删除强制转换,因为它们是多余的。

关于c - 获取任意数据的函数 : Use void* or char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com