【发布时间】:2020-08-17 20:15:08
【问题描述】:
我一直在查看一个名为 hickit 的程序,并且在某一时刻(count.c,函数从第 105 行开始),它们从 Klib 库中调用一个宏函数 (kavl_insert),如下所示:
static void hk_count_nei2_core(int32_t n_pairs, struct cnt_nei2_aux *a, int r1, int r2)
{
struct cnt_nei2_aux *root = 0;
int32_t i, j, left;
unsigned cl;
left = 0;
kavl_insert(nei2, &root, &a[0], 0);
...
查看Klib库(更具体地说,在kavl.h),这个函数(我认为)定义如下:
#define __KAVL_INSERT(suf, __scope, __type, __head, __cmp) \
__scope __type *kavl_insert_##suf(__type **root_, __type *x, unsigned *cnt_) { \
稍后在 kavl.h 文件中有这个独立的行(第 322 行):
#define kavl_insert(suf, proot, x, cnt) kavl_insert_##suf(proot, x, cnt)
我对 C 的技术知识不多(只是学习了相关的部分),我想知道它是如何工作的。大小写不同,#define 行中有“__”前体。这是如何工作的?
【问题讨论】:
-
它“不起作用”。如您所述,大小写和
__不同。必须在某处定义一个实际的kavl_insert。 -
我看了看,发现了类似的东西。 __KAVL_INSERT 和 kavl_insert 之间有联系吗?
-
不在您显示的代码中。也许
kavl_insert_nei2(即kavl_insert_##suf和suf = nei2)调用它,也许不是。 -
这里的“__scope __type”是什么意思?我在想如果有联系它就会在那里,但似乎没有
-
__scope和__type是宏的参数。从名字来看,__type是返回类型(这里*总是添加到类型中),但要确定你必须看看宏是如何调用的。