C - 枚举的前向声明?

loo*_*oop 13 c enums enumeration forward-declaration

在C中转发枚举对我来说不起作用.我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++.你在C中声明枚举器怎么办?将它们放在每个文件的顶部(或包含在内),以便文件中的所有函数都可以访问它们?谢谢

Jon*_*ler 8

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

使用选项编译时:

$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -c enum.c
$
Run Code Online (Sandbox Code Playgroud)

GCC 4.2.1(在MacOS X 10.7.1上)接受以下代码:

enum xyz;

struct qqq { enum xyz *p; };

enum xyz { abc, def, ghi, jkl };
Run Code Online (Sandbox Code Playgroud)

添加-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
$
Run Code Online (Sandbox Code Playgroud)

因此,您不应该尝试在C中使用枚举类型的前向声明; GCC允许它在不被强迫迂腐时作为扩展.


Foo*_*Bah 5

您不能“向前声明”枚举,因为编译器不知道枚举的大小。C 标准说“每个枚举类型应与 char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能够表示所有成员的值枚举”。

  • 这不是争论。`typedef struct SS;` 有效,但 `typedef enum EE;` 无效,尽管两者都有未定义的大小。实际上,前向声明只是_不_知道所涉及实体的大小。 (7认同)
  • @luserdroog 您可以在头文件中使用结构体的不完整定义,因此同样地,您可以拥有由其他地方的定义支持的枚举的不完整定义,并且在使用枚举值的每个点都包含该定义。 (4认同)
  • @luser:您可以假设指向不完整枚举的指针(如我的示例代码中所示)具有某种意义。但它非常脆弱——你的结论是,当不完整时它们基本上没有实际用途是正确的。 (3认同)