在C中,对枚举的前向声明对我来说不起作用。
我在互联网和Stack Overflow上搜索过,但是关于枚举的前向声明的问题都是关于C++的。在C中,你怎么声明枚举?
将它们放在每个文件的顶部(或者头文件中),这样文件中的所有函数都可以访问它们?
我在互联网和Stack Overflow上搜索过,但是关于枚举的前向声明的问题都是关于C++的。在C中,你怎么声明枚举?
将它们放在每个文件的顶部(或者头文件中),这样文件中的所有函数都可以访问它们?
$ /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
char
)中,也可能需要2或4个字节。 - Jonathan Lefflerenum Foo { ... }; enum Bar; enum Foo bar2foo( Bar bar );
因此,我们声明了一个返回Foo的函数。如果您想使用它,还需要包含Foo的定义。 - Martin Bonner supports Monicatypedef struct S S;
是有效的,但 typedef enum E E;
不行,尽管它们两者的大小都未定义。实际上,向前声明只是关于不知道相关实体的大小。 - alecov我来到这里有同样的错误,但是这里关于代码/错误提供的信息不是太多。
我的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;
不确定 OP 使用的是哪个 C 标准、代码或参考文献,但我有些同意:大多数针对这个相对简单问题的教程和解决方案都有点模糊。
cr = IS_SIDE;
既不是函数定义也不是声明。初始化的声明是一个声明(也是一个定义)。如果您的定义/赋值组合出现在函数作用域内,我们需要看到问题的[MCVE]。 - Jonathan LefflerCoinResult不是一个枚举,它是一种类型。如果你有
enum CoinResult {
IS_HEAD = 1,
IS_VALUE = 2,
IS_SIDE,
};
那么
enum CoinResult cr;
这是正确的。