【问题标题】:Why am I getting error when enum type variable is initialized in file scope?为什么在文件范围内初始化枚举类型变量时出现错误?
【发布时间】:2017-03-29 18:25:06
【问题描述】:

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

#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

【问题讨论】:

  • card = club 是一个语句,不能在函数体之外有语句。

标签: c enums scope initialization variable-assignment


【解决方案1】:

您首先声明了一个名为 club 类型为 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 foostruct foo 而不会发生名称冲突,因为 enumstruct 类型名称存在于不同的命名空间中。

(我个人不喜欢使用typedef - 但如果您愿意,请随意使用)。

【讨论】:

  • Nitpick:initialize a global variable on another line..我们有一个更短的名称,作业。 :)
  • @Dai 我不确定你的前两个陈述。因为我们可以声明一个全局变量并在两个不同的行上分别定义它,而不用担心编译错误。但我不确定这种情况是否适用于枚举或结构变量。如果它无效,那么我想知道它为什么无效。
  • " 因为我们可以声明一个全局变量并在两个不同的行上分别定义它,而不用担心编译错误。" - 正确,但是在您的原始代码中,您设置 card 值的行不是定义。
【解决方案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;
}

【讨论】:

  • 为什么会这样?可能是因为保证的有序执行从main()函数开始?
  • @AbhinavGauniyal 是的,你将任何运行时语句放在文件范围内,没人知道它应该何时执行,所以这是非法的。
  • @SouravGhosh 不相关但不会 main() 与 main(void) 相同,因为它是一个定义?
  • @AjayBrahmakshatriya 在 C99 中,您必须指定 foo(void) 以指示函数没有参数。如果你省略void,它就不会被认为是一个声明/原型,而是一个定义,然后事情就会变得有趣:security.stackexchange.com/questions/43042/…
  • @Dai,但它是一个定义。不是声明。
猜你喜欢
  • 2020-11-17
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多