从C中的typedef中减去一个值?

从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

我正在阅读一些Windows API头文件,看到一些我不理解的代码:

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,不必抱歉:)我说不太可能的地址比说无效地址更正确,但因为不可能的地址没有添加任何值,所以我将该点编辑掉了。至于我对二者互补的假设,同样,如果讨论这一点,我认为你会赢,因为世界上仍然存在一个互补的环境,尽管这种情况很少见。我还对这一点进行了编辑。感谢您的评论,这两点都是有效的,需要更正。