几个月前,在一次采访中,有人问我如何在 C 中实现布尔数据类型。两种最常见的方法是:
预处理器宏:
#define BOOL unsigned char
或类型定义:
typedef BOOL unsigned char;
所以我想知道使用预处理器宏或 typedef 的确切好处和权衡是什么?我经常发现自己在制作诸如“uint16”(用于无符号短裤)和“ucharp”(用于无符号字符指针)之类的数据类型。哪个最好用?
谢谢。
最自然的答案是定义枚举类型:
typedef enum {false = 0, true} BOOL;
然而,重要的是要注意,我们声明的这种类型的行为与 C99类型(最常用的是通过定义在 中的宏)BOOL
略有不同。_Bool
bool
stdbool.h
例如:
int main(void) {
BOOL B; // our type
bool b; // the type from C99
B = -true; // -1
b = -true; // 1
B = true + true; // 2
b = true + true; // 1
return 0;
}
C99bool
根据布尔代数的规则运行,而我们的 make-do 的BOOL
行为就像一个常规的int
. 这是因为类型变量enum
实际上是一个int
.
bool
如果您使用的是 C99,那么在这个地球上绝对没有正当理由滚动您自己的类型,而不仅仅是使用stdbool.h
.
不幸的是,如果您使用的是较早的标准,那么 typedef'denum
会尽可能好。