【问题标题】:Some questions with the source of the libuv?关于 libuv 来源的一些问题?
【发布时间】:2015-03-23 11:09:37
【问题描述】:

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

【问题讨论】:

    标签: c++ libuv


    【解决方案1】:

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

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

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

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

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

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


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

    &amp;rvoid** 被强制转换为 QUEUE **。然后它被取消引用为 QUEUE* 它是,即:Result 具有值 r 并键入 QUEUE*


    到目前为止,一切都很好。这与您的尝试有何不同?

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

    我们将&amp;rvoid **)转换为QUEUE*。虽然这是合法的,但我们丢失了一个存在的间接性。 结果的值为 &amp;r 并键入 QUEUE*。类型相同,值不同。


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

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

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

    最后,

    QUEUE 不适合这样使用,请查看src/threadpool.c 以获取用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-24
      • 2013-07-07
      • 2013-05-10
      • 2012-03-18
      • 2023-03-09
      • 2021-07-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多