关于libuv来源的一些问题

Some questions with the source of the libuv?

本文关键字:问题 libuv 关于      更新时间:2023-10-16

最近,我看了libuv的源代码。阅读 QUEUE.h 时有一些问题

首先:宏定义如下:

typedef void *QUEUE[2];
#define QUEUE_NEXT(q)       (*(QUEUE **) &((*(q))[0]))
#define QUEUE_PREV(q)       (*(QUEUE **) &((*(q))[1]))

我可以将QUEUE_PREV(q(重新定义为:

#define QUEUE_PREVR(q)       ((QUEUE *) &((*(q))[1]))

它们之间有什么区别?

其次:我尝试下面的代码:

typedef struct{
     int i1;
     int i5 ;
     int i6;
}s1;
typedef struct 
{
    int j1;
    int j2;
    int j3;
}s2;
s1 i = { 1, 2 ,61};
s2 j = { 97, 99, 90 };
QUEUE a;
a[0] = &i;
a[1] = &j;
cout << (QUEUE*)(&((*(&a))[1])) << endl;
cout << *(QUEUE*)(&((*(&a))[1])) << endl;

控制台上的结果是一样的,但为什么呢?"*"不起作用吗??我用VS2013编写这段代码。

首先,它们之间的区别是什么?

你说的类型是相同的是对的,但值是吗?让我们看看我们得到了什么:

QUEUE 被类型定义为指向 void 的指针的数组 2

好的,怎么样:&((*(q))[1]))

  • 采取q这是一个QUEUE*
  • 取消引用q产生QUEUE
  • 然后索引其第二个元素,即指向前一个QUEUEvoid *
  • 然后获取该指针的地址(产生一个void**(。

让我们将结果称为&r,其中r的类型为 void*

<小时 />

#define QUEUE_PREV(q) (*(QUEUE **) &r)

&rvoid**被投射到QUEUE ** .然后它被取消引用为QUEUE*,即:结果具有值r并键入 QUEUE*

<小时 />

目前为止,一切都好。这与你的尝试有什么不同?

#define QUEUE_PREVR(q) ((QUEUE *) &r)

我们将&r(void **(转换为QUEUE*。虽然这是合法的,但我们失去了存在的间接。结果具有值 &r 和类型 QUEUE* 。类型相同,值不同。

<小时 />

其次:"*"为什么不起作用?

cout << (QUEUE*)&aa << endl;
cout << *(QUEUE*)&aa << endl;

在第一行中,cout &r指针。因此,将打印指针的值。在第二行中,您cout一个数组QUEUE。使用 sizeof 之外的数组总是将结果转换为指向其第一个元素 ( &r[0] ( 的指针。我们知道&r == &r[0].

最后

QUEUE不应该以这种方式使用,请查看src/threadpool.c以获取用例。