在 C 中转发声明枚举:限制和解决方法
在 C 中,转发声明枚举以前是不可能的,因为枚举的大小取决于它的内容。然而,随着 C 11 的引入,只要明确指定枚举的大小,前向声明就成为可能。
问题陈述:
最初的问题出现了当尝试通过以下方式转发声明枚举时:
enum E; void Foo(E e); enum E {A, B, C};
此代码被拒绝
解释:
在 C 03 及更早版本中,不允许前向声明枚举,因为编译器需要知道枚举的大小才能存储它的值。枚举的大小取决于其枚举值的数量和类型。如果没有此信息,编译器无法为枚举分配内存。
C 11 及以上版本中的解决方案:
在 C 11 及更高版本中,前向声明枚举可以通过显式指定枚举的大小来实现。这可以使用枚举来完成:
例如:
enum Enum : unsigned int; // Forward declaration with an underlying type void Foo(Enum e); // Definition of the enum in a separate source file enum Enum { VALUE1, VALUE2, VALUE3 };
此代码现在将成功编译。
私有枚举值的注意事项:
在提到的特定场景中,枚举值应该保密,前瞻性声明方法仍然可行。枚举可以在头文件中私有声明并在实现文件中内部定义,而不会将枚举值暴露给客户端。
但是,需要注意的是,前向声明不会阻止访问内的枚举值相同的翻译单元(即相同的源文件或编译在一起的文件集)。因此,仍然可以从有权访问头文件的程序其他部分访问枚举值。
以上是我可以在 C 中转发声明枚举吗?如何转发?的详细内容。更多信息请关注PHP中文网其他相关文章!