从C中的typedef中减去一个值?
我正在阅读一些Windows API头文件,看到一些我不理解的代码:从C中的typedef中减去一个值?,c,winapi,C,Winapi,我正在阅读一些Windows API头文件,看到一些我不理解的代码: typedef void *HANDLE; typedef HANDLE DPI_AWARENESS_CONTEXT; #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1) 从void*typedef中减去一个值意味着什么?这是一个强制转换,而不是减法 typedef void *HANDLE; 产生一个符号句柄,相当于无效* 然后依次 ty
typedef void *HANDLE;
typedef HANDLE DPI_AWARENESS_CONTEXT;
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
从
void*
typedef中减去一个值意味着什么?这是一个强制转换,而不是减法
typedef void *HANDLE;
产生一个符号句柄
,相当于无效*
然后依次
typedef HANDLE DPI_AWARENESS_CONTEXT;
产生一个新符号DPI\u AWARENESS\u CONTEXT
,该符号相当于void*
导致表达:
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
这相当于:
#define DPI_AWARENESS_CONTEXT_UNAWARE ((void *)-1)
这意味着源代码中的DPI\u AWARENESS\u CONTEXT\u unknowledge
的任何实例在编译时扩展为(void*)
作为旁白-以下是如何和为什么:
(void *) -1 == (size_t) -1
在32位机器上是0xFFFFFFFF
,或者在64位机器上使用
0xFFFFFFFFFFFFFFFF
在每个相应体系结构的实现中,这些值相当于-1
,这使得它们在诸如(内存分配支持)或指定的例程中可用作哨兵值
注:上述陈述不适用于“一补”系统,但如“一补”所示,这种情况很少见,而且不太可能在最近的任何大规模商业环境中使用。没有减法进行-
DPI\u感知\u上下文\u unknowledge
扩展为-1
的值,转换为无效*
。它似乎被用作DPI\u AWARENESS\u CONTEXT
类型的哨兵值(这是HANDLE
的typedef,这是void*
的typedef)。我认为它是(void*)-1的一种类型,而不是void中减去1*假设\define
不存在,然后在代码DPI\u AWARENESS\u上下文中
将是指向某个地址的指针。现在让我们介绍一下#define
。在所有出现的DPI\u AWARENESS\u上下文中
将有一个尾随-1
。指针算术的意思是前面的地址。啊,我的脑子搞错了!干杯鉴于各自的体系结构,这两个地址都是有效的。这两个地址都不是-1
的等效地址,除非您假设2s补码表示。虽然Windows的ABI需要它,但这两种体系结构都不要求它。许多错误与权利交织在一起,仍然会产生错误。抱歉。@IInspectable-LOL,不必抱歉:)我说不太可能的地址比说无效地址更正确,但因为不可能的地址没有添加任何值,所以我将该点编辑掉了。至于我对二者互补的假设,同样,如果讨论这一点,我认为你会赢,因为世界上仍然存在一个互补的环境,尽管这种情况很少见。我还对这一点进行了编辑。感谢您的评论,这两点都是有效的,需要更正。