C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?
当前回答
从好到坏:
选项1(C99及更新版本)
#include <stdbool.h>
选项2
typedef enum { false, true } bool;
选项3
typedef int bool;
enum { false, true };
选项4
typedef int bool;
#define true 1
#define false 0
解释
只有当你使用C99(或更高版本)时,选项1才会起作用,这是“标准方式”。如果可能,请选择此选项。选项2、3和4实际上具有相同的行为#2和#3不使用#defines,我认为这更好。
如果你还没有决定,那就选择#1!
其他回答
如果使用C99,则可以使用_Bool类型。不需要#includes。不过,您确实需要将其视为整数,其中1为真,0为假。
然后可以定义TRUE和FALSE。
_Bool this_is_a_Boolean_var = 1;
//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;
C有一个布尔类型:bool(至少在过去10(!)年)
包括stdbool.h和true/false将按预期工作。
如果您使用的是C99编译器,它内置了对布尔类型的支持:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
http://en.wikipedia.org/wiki/Boolean_data_type
从好到坏:
选项1(C99及更新版本)
#include <stdbool.h>
选项2
typedef enum { false, true } bool;
选项3
typedef int bool;
enum { false, true };
选项4
typedef int bool;
#define true 1
#define false 0
解释
只有当你使用C99(或更高版本)时,选项1才会起作用,这是“标准方式”。如果可能,请选择此选项。选项2、3和4实际上具有相同的行为#2和#3不使用#defines,我认为这更好。
如果你还没有决定,那就选择#1!
以下是我使用的版本:
typedef enum { false = 0, true = !false } bool;
因为false只有一个值,但逻辑true可以有多个值,但是技术将true设置为编译器将使用的与false相反的值。
这解决了某些人编码的问题,这些问题可以归结为:
if (true == !false)
我想我们都会同意,这不是一个好的做法,但为了一次性的“真=!假”,我们消除了这个问题。
[编辑]最后我使用了:
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
以避免与定义true和false的其他方案的名称冲突。但这一概念保持不变。
[EDIT]要显示整数到布尔值的转换:
mybool somebool;
int someint = 5;
somebool = !!someint;
第一个(最右边)!将非零整数转换为0,然后是第二个(最左边)!将0转换为myfalse值。我将把它作为练习留给读者来转换一个零整数。
[编辑]当需要特定值时,我的风格是在枚举中使用值的显式设置,即使默认值相同。示例:因为false需要为零,所以我使用false=0,而不是false,
[编辑]演示如何在使用gcc编译时限制枚举的大小:
typedef __attribute__((__packed__)) enum { myfalse = 0, mytrue = !myfalse } mybool;
也就是说,如果有人这样做:
struct mystruct {
mybool somebool1;
mybool somebool2;
mybool somebool3;
mybool somebool4;
}
结构的大小将是4字节而不是16字节。