在文件范围初始化枚举类型变量时,为什么会出现错误?

时间:2017-03-29 18:25:06

标签: c enums scope initialization variable-assignment

当我尝试将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

2 个答案:

答案 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 ++不同)对于每种类型都有不同的命名空间 - 因此您可以在同一个项目中使用enumenum foo而无需使用名称因为struct fooenum类型名称存在于不同的名称空间中而发生冲突。

(我个人不喜欢使用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;
}