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,但它是一个定义。不是声明。