关于libuv的一些问题?

时间:2015-03-23 11:09:37

标签: c++ libuv

最近,我读了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编写了这段代码。

1 个答案:

答案 0 :(得分:2)

首先,它们之间的差异是什么?

你说对的类型是一样的,但价值是多少?让我们来看看我们得到了什么:

  

QUEUE is typedef'd as an array 2 of pointer to void

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

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

让我们调用结果&r r类型为void*


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

<{> &r void**QUEUE **强制转换为QUEUE*。然后它被解除引用为r,即:结果具有值QUEUE*并且键入#define QUEUE_PREVR(q) ((QUEUE *) &r)


到目前为止,这么好。这与你的尝试有何不同?

&r

我们将void **QUEUE*)投射到&r。虽然这是合法的,但我们失去了存在的间接性。 结果的值为QUEUE*,类型为cout << (QUEUE*)&aa << endl; cout << *(QUEUE*)&aa << endl; 。类型相同,值不是


其次:为什么没有&#34; *&#34;工作?

cout

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

最后,

{{1}}并不意味着以这种方式使用,请查看src/threadpool.c而不是用例。