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