当我尝试将enum变量初始化为全局变量时,我无法理解这种情况,即在任何范围之外。例如,如果我尝试编译下面的代码:
#include <stdio.h>
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card;
card = club;
int main()
{
printf("Size of enum variable = %d bytes", sizeof(card));
return 0;
}
发生以下编译错误:
prog.c:9:1: warning: data definition has no type or storage class
card = club;
^
prog.c:9:1: warning: type defaults to 'int' in declaration of 'card' [Wimplicit-int]
prog.c:9:1: error: conflicting types for 'card'
prog.c:8:3: note: previous declaration of 'card' was here
} card;
^
但是当我将初始化放在main()范围内时,没有像下面的代码那样发生错误:
#include <stdio.h>
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card;
int main()
{
card = club;
printf("Size of enum variable = %d bytes", sizeof(card));
return 0;
}
输出是:
Size of enum variable = 4 bytes
答案 0 :(得分:2)
您的第一个声明名为club
的{{1}}类型的全局变量,但是您不能在函数外的另一行初始化全局变量 - 您必须在同一行上执行它,如下所示:
enum suit
如果您将enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card = club;
定义从变量声明中移开,我觉得您的代码更具可读性:
enum club
额外enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
};
enum suit card = club;
关键字是因为C(与C ++不同)对于每种类型都有不同的命名空间 - 因此您可以在同一个项目中使用enum
和enum foo
而无需使用名称因为struct foo
和enum
类型名称存在于不同的名称空间中而发生冲突。
(我个人不喜欢使用struct
- 但如果您选择,请随意使用。
答案 1 :(得分:2)
这是因为
card = club;
是 assignment statement ,需要在块范围内(某些函数体)不在文件范围内,而不是初始化。
如果你使用initialization,那就可以了。
还要注意额外的更改
int main()
应为int main(void)
sizeof
会产生size_t
,因此您应该使用%zu
格式说明符来打印结果。实施例
#include <stdio.h>
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card = club;
int main(void)
{
printf("Size of enum variable = %zu bytes", sizeof(card));
return 0;
}