初始化枚举变量的警告:类型在“etatCourant”的声明中默认为“int” [-Wimplicit-int]

warning for initialized enum variable : type defaults to 'int' in declaration of 'etatCourant' [-Wimplicit-int]

提问人:Classy Fied 提问时间:8/30/2023 最后编辑:Vlad from MoscowClassy Fied 更新时间:8/30/2023 访问量:64

问:

当我尝试初始化我的枚举变量时,我收到警告。代码如下:

enum etatCourant {REPOS, MARCHE_AV, MARCHE_AR, ERREUR};
etatCourant = REPOS; 

这是警告:type 在“etatCourant”的声明中默认为“int” [-Wimplicit-int]

我错过了什么吗?

代码按预期工作,但我只是不喜欢警告。我尽量避免它们

C 枚举 声明 编译器警告

评论

0赞 Jabberwocky 8/30/2023
这不应该编译:godbolt.org/z/EMzjGrnE7
0赞 Lundin 8/30/2023
我无法重现 - 听起来您使用的是上个千年极其过时的编译器。你为什么要这样做?谁告诉你用的?
0赞 Classy Fied 8/30/2023
@Lundin我正在使用 STM32CubeIDE 1.12.1 编写 STM32 核板。我非常怀疑编译器已经过时了,但谢谢
0赞 Lundin 8/30/2023
自 1999 年以来,类型可能不再默认为 int,因此它应该已经过时了。您没有回答您使用的是哪个编译器。
0赞 wek 8/31/2023
@Jabberwocky尝试 C not C++,并将声明放在任何函数之外。

答:

1赞 Vlad from Moscow 8/30/2023 #1

您正在尝试声明一个变量,其名称与枚举标记名称一致,而未在变量的声明中指定类型说明符

enum etatCourant {REPOS, MARCHE_AV, MARCHE_AR, ERREUR};
etatCourant = REPOS; 
^^^^^^^^^^^

因此,根据编译器消息,它假定默认情况下它将具有类型。int

如果要声明枚举类型的变量,则需要编写例如

enum etatCourant {REPOS, MARCHE_AV, MARCHE_AR, ERREUR};
enum etatCourant courant = REPOS; 

在这种情况下,变量将具有枚举类型。courantenum etatCourant

或者声明也可以重写,就像

enum etatCourant etatCourant = REPOS; 

尽管这样的声明可能会使代码的读者感到困惑。

代码按预期工作,但我只是不喜欢警告。我试着 尽可能避免它们

该代码按预期工作,因为在 C 中枚举属于整数类型,而枚举器具有 .int

评论

0赞 Jabberwocky 8/30/2023
这不应该编译:godbolt.org/z/EMzjGrnE7
0赞 Classy Fied 8/30/2023
@VladfromMoscow 哦,好的,非常感谢。我忘记了它像结构一样工作
0赞 Vlad from Moscow 8/30/2023
@ClassyFied完全没有。在 C 中,与 C++ 结构相反,联合和枚举标记名称与普通标识符位于不同的命名空间中。
0赞 fukanchik 8/30/2023 #2

在旧式函数声明中,可以跳过参数类型。编译器会将其视为 int:

enum etatCourant {REPOS, MARCHE_AV, MARCHE_AR, ERREUR};

void foo(etatCourant)
{
  etatCourant = REPOS; 
}

int main()
{
  int a=0;
  foo(a);
  return a;
}

编译器在这里看到好像它声明了foo

void foo(int etatCourant);

因此,您会收到警告:

x.c:3:6: warning: type of ‘etatCourant’ defaults to ‘int’ [-Wimplicit-int]
3 | void foo(etatCourant)
  |      ^~~

只需将类型添加到函数声明中即可:

void foo(enum etatCourant etatCourant);

警告就会消失。