我搜索了前方声明,并没有看到任何办法让我的情况有效。所以这就是:
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将会出现有关重新定义的错误。
有什么想法吗?感谢。
答案 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吗?
“我可能而且经常出错”