在C中定义的C ++中正向声明枚举

时间:2014-02-18 22:58:03

标签: c++ c enums declaration forward

我搜索了前方声明,并没有看到任何办法让我的情况有效。所以这就是:

1)有一个 C-header 文件,一个导出界面,可以说是一个包含enum typedef的大型多组件软件

“export.h”:

// This is in "C"!
typedef enum _VM_TYPE {...., ...., ...,} VM_TYPE;

2)部分代码 中的使用该导出。

“cpp_code.cpp”:

// This is in C++
#include "export.h"
#include "cpp_header.hpp"
{ .... using VM_TYPE values to do stuffs....}

“cpp_header.hpp”:

// Need to somehow forward declear VM_TYPE here but how?
Struct VM_INFO {
....
VM_TYPE VType; //I need to add this enum to the struct
....
};

很明显,问题出现在cpp_head.hpp中,因为它不知道枚举。

我尝试添加到cpp_header.hpp

typedef enum _VM_TYPE VM_TYPE;

它实际上会起作用。 那为什么这个有用?因为它有C风格的语法?! 无论如何,我被告知不要通过上层“管理”这样做(“这是C ++,而不是C”)。

根据当前的事情如何联系,还有其他方法可以完成这项工作吗?他们不想更改/添加包含文件; “枚举类”只是c ++,对吗?仅将“enum VM_TYPE”添加到cpp_header.hpp将会出现有关重新定义的错误。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:1)

在您的问题中描述的特定情况下,您根本不需要转发声明。在编译正确开始之前,您#include所有文件基本上都会被复制粘贴到一个翻译单元中,并且由于您#include "export.h" 之前 #include "cpp_header.hpp",然后它才会起作用,因为当编译器看到struct VM_INFO的定义时,它已经看到了enum _VM_TYPE的定义,所以你没有问题。在"export.h"中包含"cpp_header.hpp"并在"cpp_code.cpp"中按顺序包含它们之间基本没有区别,因为您在预处理后最终会得到基本相同的代码。因此,您需要做的就是确保以正确的顺序获得包含。

如果您想要#include "cpp_header.hpp" ,而包含"export.h"在翻译单元中,您需要访问struct VM_INFO的成员(以便将其保留为"export.h"不完整的类型不是一个选项)然后"cpp_header.hpp"设计得很糟糕,你应该将你可能需要的任何东西的定义分成新的标题。如果,正如评论所暗示的那样,你绝对不能做到这一点并且需要设计不合理,那么你的下一个最佳选择就是拥有两个版本的enum _VM_TYPE,其中一个只重复{{1}的定义},而不是。您#include在{em>不 #include "export.h"的任何翻译单元中#include,以及_VM_TYPE您所在的任何翻译单元中的第二个版本。显然,这种类型的代码重复将来会引发问题。

此外,以下划线和大写字母开头的名称始终保留在C中,因此您实际上不应该使用它们。如果C的未来版本决定使用{{1}},那么您将无法使用过时版本的C,或者让所有这些代码中断。

答案 1 :(得分:0)

枚举不能是前向声明,因为编译器需要知道枚举的大小。底层的枚举器是特定于编译器的,但通常是int。你能把枚举作为一个int吗?

“我可能而且经常出错”