【发布时间】:2018-02-01 18:41:10
【问题描述】:
你不能 forward declare an enum in C++,但你可以在 C 中。
对于使用一些 C++ 代码的 C 代码库,有没有办法在 C 中使用前向声明的枚举,当在 C++ 中使用该标头时(在 extern "C" {..} 块内)不会导致错误?
例子:
extern "C" {
enum MyEnum;
}
int main() { return 0; }
GCC 给出错误:
error: use of enum ‘MyEnum’ without previous declaration
enum MyEnum;
^~~~~~
Clang 也失败了:
error: ISO C++ forbids forward references to 'enum' types
enum MyEnum;
为了给出一些上下文,这是一个主要的 C 代码库,其中一个小的 C++ 模块恰好包含 C 代码的标头。我可以做一些 hack 让 C++ 忽略枚举,但我想知道 C++ 在这种情况下是否可以使用 C 头文件。
更新:已经注意到官方 C 规范不支持这一点。然而,这似乎是一些最广泛使用的编译器的事实标准:GCC、Clang 和 Microsoft Visual C++。
【问题讨论】:
-
这可能有帮助吗? stackoverflow.com/questions/71416/…
-
您遇到了什么样的错误?请提供minimal reproducible example 并显示实际的错误消息
-
什么?您不能在 C 中转发声明枚举。只能在 C++ 中。
-
@storyteller - 它在 C11 中工作,afaik 它也适用于旧 C 版本。
-
@ideasman42 - 直到它不是。并且不能保证每个编译器与 C++ 的互操作性都是相同的。没有标准的 C 解决方案。 “事实上的”标准在交叉编译时毫无意义。