C - 枚举的前向声明

问题描述 投票:0回答:4

C 中枚举的前向声明对我不起作用。

我搜索了互联网和 Stack Overflow,但所有有关枚举器前向声明的问题都涉及 C++。在 C 中声明枚举器要做什么?

将它们放在每个文件的顶部(或标头中),以便文件中的所有函数都可以访问它们?

c enums enumeration forward-declaration
4个回答
14
投票

将它们放在标头中,以便所有需要它们的文件都可以访问标头并使用其中的声明。

使用选项编译时:

$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -c enum.c

GCC 4.2.1(在 Mac OS X 10.7.1 (Lion) 上)接受以下代码:

enum xyz; struct qqq { enum xyz *p; }; enum xyz { abc, def, ghi, jkl };
添加

-pedantic

,它会警告:

$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -pedantic -c enum.c enum.c:1: warning: ISO C forbids forward references to ‘enum’ types enum.c:5: warning: ISO C forbids forward references to ‘enum’ types
因此,您不应该尝试在 C 中使用枚举类型的前向声明; GCC 允许在不被迫迂腐的情况下将其作为扩展。


6
投票
您不能“前向声明”枚举,因为编译器不知道枚举的大小。 C 标准规定“每个枚举类型应与 char、有符号整数类型或无符号整数类型兼容。

类型的选择是实现定义的,但应能够表示枚举所有成员的值”。


0
投票
我来到这里遇到了同样的错误,但这里没有提供有关代码/错误的太多信息。

我的 Makefile 标志是:

-Wall -Wextra -Werror -pedantic -std=c17


在我的标题中,我有以下内容

enum

typedef enum { IS_HEAD = 1, IS_VALUE = 2, IS_SIDE } CoinResult;
教程

这里那里

建议使用这样的东西:

enum CoinResult cr; cr = IS_SIDE;

这会导致OP指出的错误。

通过使用解决:

CoinResult cr = IS_SIDE;
不确定使用的是哪个 C 标准、代码或参考 OP,但我有些同意:针对这个相对简单的问题的大多数教程和解决方案都有点模糊。


-1
投票
CoinResult 不是枚举,而是类型。如果你有

enum CoinResult { IS_HEAD = 1, IS_VALUE = 2, IS_SIDE, };
然后

enum CoinResult cr;
是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.