【发布时间】:2017-12-07 15:02:39
【问题描述】:
我试图了解,定义 BYTE、WORD 和 DWORD 宏的最佳方法是什么,这在 question 的答案中有所提及。
#define LOWORD(l) ((WORD)(l)) #define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) #define LOBYTE(w) ((BYTE)(w)) #define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
假设是否正确:
-
BYTE被宏定义为#define BYTE __uint8_t -
WORD被宏定义为#define WORD __uint16_t -
DWORD是宏定义为#define DWORD __uint32_t
如果是,为什么要转换为另一个宏而不是转换为 __uint8_t、__uint16_t 或 __uint32_t?这样写是为了提高清晰度吗?
我还找到了另一个question,其中的答案包括typedef,还有一点点研究我找到了question about comparing #define and typedef 的答案。在这种情况下使用typedef 会更好吗?
【问题讨论】:
-
你可以为所欲为。它们是 Windows 上使用的名称。像
__uint8_t这样的名字完全是非标准的。他们是否做你想做的事是编译器的心血来潮。 -
除了使用 __uint8_t、__uint16_t 或 __uint32_t,您还可以包含
stdint.h并使用 uint8_t、uint16_t 或 uint32_t 其中conform the standard。 -
这些是来自 Windows SDK 的 typedef,它们将 winapi 与 C 编译器实现和处理器架构隔离开来。你的#defines 看起来不错。您发布的宏是简单的破解程序,用于从较大的整数类型中提取 8 位或 16 位值,SendMessage() 特别需要大量处理才能将消息参数放入它所采用的两个参数中。 30 年前,当他们不得不将 GUI 塞进 1/4 兆字节的内存中时,这种经济状况很重要。
-
@JonathanLeffler 但是在 GNU/Linux 环境中使用像 GNU GCC 这样的编译器怎么样?
-
GCC 怎么样?双下划线名称保留供实现用于任何目的。它们不受任何标准的强制。您所拥有的将适用于 GCC(以及 Clang,因为它模拟 GCC),但其他编译器不需要识别类型。
标签: c