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

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

typedef void *HANDLE;

typedef HANDLE DPI_AWARENESS_CONTEXT;

#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)

void *typedef 中减去一个值是什么意思?

回答

有没有减法要去-DPI_AWARENESS_CONTEXT_UNAWARE扩展到价值-1作为铸件void *。它似乎被用作DPI_AWARENESS_CONTEXT类型的标记值(这是一个 typedef for HANDLE,这是一个 typedef for void *)。


回答

这是一个演员,而不是一个减法。

typedef void *HANDLE;

产生一个HANDLE等价于的符号void *

然后依次

typedef HANDLE DPI_AWARENESS_CONTEXT;

产生一个新的符号DPI_AWARENESS_CONTEXT,相当于void *

导致表达式:

#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)

这相当于:

#define DPI_AWARENESS_CONTEXT_UNAWARE ((void *)-1)

意味着DPI_AWARENESS_CONTEXT_UNAWARE源代码中的任何实例(void *)在编译时扩展为。

顺便说一句 - 以下是方法和原因:

(void *) -1 == (size_t) -1

这是0xFFFFFFFF在 32 位机器上,
还是0xFFFFFFFFFFFFFFFF在 64 位机器上。

在每个相应体系结构的二进制补码实现中,这些值等效于-1,使它们可用作例程中的标记值,例如sbrk())(内存分配支持),或指定每英寸点数 (dpi) 感知上下文。

注意:上述陈述对于补码系统是不正确的,但正如这篇文章中的答案所示,补码很少见,并且不太可能在最近的任何大规模商业环境中使用。


以上是从C中的typedef中减去一个值?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>