-1

几个月前,在一次采访中,有人问我如何在 C 中实现布尔数据类型。两种最常见的方法是:

预处理器宏:

#define BOOL unsigned char

或类型定义:

typedef BOOL unsigned char;

所以我想知道使用预处理器宏或 typedef 的确切好处和权衡是什么?我经常发现自己在制作诸如“uint16”(用于无符号短裤)和“ucharp”(用于无符号字符指针)之类的数据类型。哪个最好用?

谢谢。

4

1 回答 1

2

最自然的答案是定义枚举类型:

typedef enum {false = 0, true} BOOL;

然而,重要的是要注意,我们声明的这种类型的行为与 C99类型(最常用的是通过定义在 中的宏)BOOL略有不同。_Boolboolstdbool.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会尽可能好。

于 2013-06-22T05:47:41.827 回答