C 为什么在文件范围内初始化枚举类型变量时出错?

C 为什么在文件范围内初始化枚举类型变量时出错?,c,enums,scope,initialization,variable-assignment,C,Enums,Scope,Initialization,Variable Assignment,当我试图将枚举变量初始化为全局变量时,即在任何范围之外,我无法理解这种情况。例如,如果我尝试编译以下代码: #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(ca

当我试图将枚举变量初始化为全局变量时,即在任何范围之外,我无法理解这种情况。例如,如果我尝试编译以下代码:

#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;
}
但是,当我将初始化放在主范围内时,不会出现如下代码所示的错误:

#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;
}

您首先声明了一个名为club of type 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;

额外EnUM关键字是因为C不同于C++,每个类型都有不同的命名空间,所以在同一个项目中,可以有EnUM Foo和StULTFO,而名称不冲突,因为EnUM和Struts类型名称存在于不同的命名空间中。


我个人不喜欢使用typedef,但如果您愿意,可以随意使用。

您首先声明了一个名为club of type 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;

额外EnUM关键字是因为C不同于C++,每个类型都有不同的命名空间,所以在同一个项目中,可以有EnUM Foo和StULTFO,而名称不冲突,因为EnUM和Struts类型名称存在于不同的命名空间中。 我个人不喜欢使用typedef,但如果你愿意,请随意使用它。

这是因为

  card = club;
是一个,它需要在块范围内一些函数体不在文件范围内,而不是一个初始化

如果你使用,它会起作用

还要注意额外的变化

int main应该是int mainvoid sizeof产生一个大小,因此您应该使用%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;
}
这是因为

  card = club;
是一个,它需要在块范围内一些函数体不在文件范围内,而不是一个初始化

如果你使用,它会起作用

还要注意额外的变化

int main应该是int mainvoid sizeof产生一个大小,因此您应该使用%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;
}

card=club是一个语句,不能在函数体之外有语句。card=club是一个语句,不能在函数体之外有语句。挑剔:在另一行初始化全局变量。我们有一个较短的名称,赋值:@戴:我不确定你的前两个说法。因为我们可以声明一个全局变量,并在两个不同的行上分别定义它,而不必担心编译错误。但我不确定这种情况是否对enum有效,或者可能对结构变量有效。如果它是无效的,那么我想知道为什么它是无效的。因为我们可以声明一个全局变量,并在两行上分别定义它,而不必担心编译错误正确,但是在原始代码中,设置卡值的行不是定义。挑剔:在另一行初始化全局变量。我们有一个较短的名称,赋值:@戴:我不确定你的前两个说法。因为我们可以声明一个全局变量,并在两个不同的行上分别定义它,而不必担心编译错误。但我不确定这种情况是否对enum有效,或者可能对结构变量有效。如果它是无效的,那么我想知道为什么它是无效的。因为我们可以声明一个全局变量,并在两行上分别定义它,而不必担心编译错误正确,但是在您的原始代码中,设置卡值的行不是定义。为什么是这样?可能是因为保证有序执行从主函数开始?@AbhinavGauniyal yes,您将任何运行时语句放入文件范围,没有人知道它应该在何时执行,因此它是非法的。@SouravGhosh不相关,但main不会与mainvoid相同,因为它是一个定义?@AjayBrahmakshatriya在C99中,您必须指定foovid以指示函数没有参数。如果省略void,它就不是一个声明/原型,而是一个定义,然后事情就变得有趣了:@Dai,但它是一个定义。不是声明,为什么?可能是因为保证有序执行从主函数开始?@AbhinavGauniyal yes,您将任何运行时语句放入文件范围,没有人知道它应该在何时执行,因此它是非法的。@SouravGhosh不相关,但main不会与mainvoid相同,因为它是一个定义?@AjayBrahmakshatriya在C99中,您必须指定foovid以指示函数没有参数。如果省略void,它就不是一个声明/原型,而是一个定义,然后事情就变得有趣了:@Dai,但它是一个定义。不是声明。