gpt4 book ai didi

c - 头文件中的完整宏

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

我找到了一个头文件来定义哈希表,代码如下:

#ifndef HASH_H
#define HASH_H

#define DEFINE_HASHTABLE(name, type, key, h_list, hashfunc)\
\
struct list * hashtable;\
\
static int hashtable_init (size_t size)\
{\
unsigned long i;\
hashtable = (struct list*)malloc(size * sizeof (struct list_head));\
if (!hashtable)\
return -1;\
for (i = 0; i < size; i++)\
INIT_LIST_HEAD(&hashtable[i]);\
return 0;\
}\
\
static inline void hashtable_add(type *elem)\
{\
struct list_head *head = hashtable + hashfunc(elem->key);\
list_add(&elem->h_list, head);\
}\
\
static inline void hashtable_del(type *elem)\
{\
list_del(&elem->h_list);\
}\
\
static inline type * hashtable_find(unsigned long key)\
{\
type *elem;\
struct list_head *head = hashtable + hashfunc(key);\
\
list_for_each_entry(elem, head, h_list){\
if (elem->key == key) \
return elem; \
}\
return NULL;\
}

#endif /* _HASH_H */

我从未见过这样的头文件。这种写标题的方式有什么好处(我的意思是完整的宏)?是关于通用性还是类似的东西?

最佳答案

这是一种尝试确保所有散列函数调用的内联请求都被授予的方法,即在进行散列表操作时减少函数调用的次数。

这只是一次尝试,它不能保证函数会被内联,但通过将它们设为 static 至少可以提高机会。参见 this question关于这个的很多讨论,特别是 @Christophanswer here .

请注意,每个 C 文件它只会工作一次,因为函数名称中没有添加“唯一”部分。

如果你这样做:

#include "hash.h"

DEFINE_HASHTABLE(foo, /* rest of arguments */);
DEFINE_HASHTABLE(bar, /* another bunch of args */);

您将遇到编译错误,因为所有 hashtable_ 函数都将被定义两次。宏编写者可以通过将 name 添加到宏集定义的所有内容(变量和函数)来改进这一点。

即这个:

struct list * hashtable;\
\
static int hashtable_init (size_t size)\

应该变成这样:

static list *hashtable_ ##name;\
\
static int hashtable_ ##name ##_init(size_t size)\

等等(其中 name 是第一个宏参数,即上面示例中的 foobar)。

关于c - 头文件中的完整宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26523857/

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