几个月前,在一次采访中,我被问到如何在C中实现一个布尔数据类型。两种最常见的方式是:
预处理器宏:
#define BOOL unsigned char
或者typedef:
typedef BOOL unsigned char;
所以我想知道使用预处理器宏或typedef的确切好处和权衡取舍是什么?我经常发现自己制作的数据类型如“uint16”(对于unsigned short)和“ucharp”(对于unsigned char指针)。哪个最好用?
感谢。
答案 0 :(得分:2)
最自然的答案是定义枚举类型:
typedef enum {false = 0, true} BOOL;
重要需要注意的是,我们声明的此BOOL
类型与C99 _Bool
类型的行为略有不同(最常用于{ {1}}中定义的{1}}宏。
例如:
bool
C99 stdbool.h
根据Boolean algebra的规则行事,而我们的make-do 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;
}
就像常规bool
一样。这是因为BOOL
类型的变量实际上是int
。
如果您使用的是C99,那么地球上完全没有合理的理由来推广您自己的类型,而不仅仅是使用enum
中定义的int
。
如果您使用的是较早的标准,那么不幸的是,typedef'd bool
的效果会很好。