关于libuv来源的一些问题
Some questions with the source of the 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编写这段代码。
首先,它们之间的区别是什么?
你说的类型是相同的是对的,但值是吗?让我们看看我们得到了什么:
QUEUE 被类型定义为指向 void 的指针的数组 2
好的,怎么样:&((*(q))[1]))
- 采取
q
这是一个QUEUE*
。 - 取消引用
q
产生QUEUE
。 - 然后索引其第二个元素,即指向前一个
QUEUE
的void *
- 然后获取该指针的地址(产生一个
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;
在第一行中,cout
&r
指针。因此,将打印指针的值。在第二行中,您cout
一个数组QUEUE
。使用 sizeof
之外的数组总是将结果转换为指向其第一个元素 ( &r[0]
( 的指针。我们知道&r == &r[0]
.
最后
QUEUE
不应该以这种方式使用,请查看src/threadpool.c
以获取用例。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 关于libuv来源的一些问题