【发布时间】:2011-05-08 18:22:24
【问题描述】:
我只是用 C 编写代码,结果发现它没有布尔/布尔数据类型。是否有任何 C 库可以包含以使我能够返回 boolean/bool 数据类型?
【问题讨论】:
-
通常使用一个普通的旧 'int',假设 0 是 'false' 而其他都是 'true'。
我只是用 C 编写代码,结果发现它没有布尔/布尔数据类型。是否有任何 C 库可以包含以使我能够返回 boolean/bool 数据类型?
【问题讨论】:
如果你有一个支持 C99 的编译器,你可以
#include <stdbool.h>
否则,您可以根据需要定义自己的。根据您的使用方式(以及您是否希望能够将代码编译为 C++),您的实现可能很简单:
#define bool int
#define true 1
#define false 0
不过,在我看来,您不妨只使用int 并使用零表示错误,使用非零表示正确。这就是它通常在 C 中完成的方式。
【讨论】:
true 和 false 都是分别被 1 和 0 替换的宏,并且bool 是一个扩展为布尔类型 _Bool 的宏。
bool、true 和false 定义宏,则将返回类型设为bool 并返回false。否则,只需将您的返回类型设为int 并返回0。这取决于你想做什么。我只是认为非宏观方法更好。
实际上,C99 有一个布尔数据类型,但如果您必须使用旧版本,只需定义一个类型:
typedef enum {false=0, true=1} bool;
【讨论】:
bool C99 之前的版本是危险的,因为语义不同。 (bool)2 产生 2,而不是 1。更现实的例子:1U<<(bool)isdigit(c) 在大多数实现中都会给出错误的结果。
C99 有一个bool 类型。要使用它,
#include <stdbool.h>
【讨论】:
作为 James McNellis 答案的替代方案,我总是尝试对 bool 类型使用枚举而不是宏:typedef enum bool {false=0; true=1;} bool;。 b/c 更安全,它允许编译器进行类型检查并消除宏扩展竞争
【讨论】:
bool b = 1;
#define bool int 获得的内容,没有额外的类型检查。
float f; f = true; 应该对隐式(并且可能不兼容)类型转换发出警告。
C99 引入了 _Bool 作为内在纯布尔类型。不需要#includes:
int main(void)
{
_Bool b = 1;
b = 0;
}
在真正符合 C99(或更高版本)的 C 编译器上,上述代码应该可以完美编译。
【讨论】:
我们可以为此使用枚举类型。我们不需要库。 例如
enum {false,true};
false 的值为 0,true 的值为 1。
【讨论】:
struct Bool {
int true;
int false;
}
int main() {
/* bool is a variable of data type – bool*/
struct Bool bool;
/*below I’m accessing struct members through variable –bool*/
bool = {1,0};
print("Student Name is: %s", bool.true);
return 0;
}
【讨论】: