我有一个非常简单的c代码:
#include<stdio.h>
int main()
{
enum boolean{true,false};
boolean bl=false;
if(bl==false)
printf("This is the false value of boool\n");
boolean bl1=true;
if(bl1==true)
{
printf("This is the true value of boool\n");
}
return 0;
}
我只是尝试使用枚举类型变量。但它会出现以下错误:
tryit4.c:5: error: ‘boolean’ undeclared (first use in this function)
tryit4.c:5: error: (Each undeclared identifier is reported only once
tryit4.c:5: error: for each function it appears in.)
tryit4.c:5: error: expected ‘;’ before ‘bl’
tryit4.c:6: error: ‘bl’ undeclared (first use in this function)
tryit4.c:8: error: expected ‘;’ before ‘bl1’
tryit4.c:9: error: ‘bl1’ undeclared (first use in this function)
我认为没有任何理由。你能解释一下它可能是什么原因吗?
答案 0 :(得分:10)
在C中,有两个(实际上更多,但我保留它)类型的名称空间:普通标识符和标记标识符。 struct,union或enum声明引入了标记标识符:
enum boolean { true, false };
enum boolean bl = false;
从中选择标识符的命名空间由语法环绕指定。在这里,它由enum
作为前缀。如果要引入普通标识符,请将其放在typedef声明中
typedef enum { true, false } boolean;
boolean bl = false;
普通标识符不需要特殊语法。如果您愿意,也可以声明标签和普通标签。
答案 1 :(得分:7)
您必须声明变量的类型为enum boolean,而不仅仅是boolean。使用typedef,如果你发现写enum boolean b1 = foo();繁琐。
答案 2 :(得分:7)
这样定义你的枚举真的是个好主意:
typedef enum {
False,
True,
} boolean;
有几个原因:
true
和false
(小写)可能是保留字答案 3 :(得分:7)
声明enum boolean { true, false }
时,声明一个名为enum boolean
的类型。该声明后您必须使用的名称为enum boolean
,而不仅仅是boolean
。
如果您想要更短的名称(例如boolean
),则必须将其定义为原始全名的别名
typedef enum boolean boolean;
如果您愿意,可以在一个声明中声明enum boolean
类型和boolean
别名
typedef enum boolean { true, false } boolean;
答案 4 :(得分:3)
您声明枚举,但不是类型。你想要的是
typedef enum{false, true} boolean; // false = 0 is expected by most programmers
这还有很多问题:
* true
和false
是许多C编译器中的保留字
*明确使用true和false违反C中布尔表达式的一般做法,其中0表示false,任何非零表示true。例如:
int found = (a == b);
<小时/> 编辑:这适用于gcc 4.1.2:
[wally@zf ~]$ ./a.out
This is the false value of boool
This is the true value of boool
[wally@zf ~]$ cat t2.c
#include<stdio.h>
int main()
{
typedef enum {true,false} boolean;
boolean bl=false;
if(bl==false)
printf("This is the false value of boool\n");
boolean bl1=true;
if(bl1==true)
{
printf("This is the true value of boool\n");
}
return 0;
}
答案 5 :(得分:1)
如前面的答案所示,请使用typedef:
typedef enum { true, false } boolean;
答案 6 :(得分:0)
来自 FAQ - C ++支持哪些C不包含的功能列表:
bool keyword
这个常见问题解答有点不准确,更好地说明了“C ++支持C89不包含的功能列表”
将#include <stdbool.h>
添加到您的代码中,它将在尝试实现C99的编译器(例如gcc)上编译为C99。