我搜索了前向声明,但没有找到使我的处境正常的任何方法。所以这里是:
1)有一个C-header文件,这是一个导出接口,可以说是一个大型的多组件软件,其中包含一个enum typedef
“ export.h”:
// This is in "C"!
typedef enum _VM_TYPE {...., ...., ...,} VM_TYPE;
2)在C ++中,部分代码使用该导出。
“ 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 ++,对吗?仅将“枚举VM_TYPE”添加到cpp_header.hpp将获得有关重新定义的错误。
任何想法?谢谢。
在问题中描述的特定情况下,您根本不需要转发声明。#include
在编译正常开始#include "export.h"
之前#include "cpp_header.hpp"
,您实际上将要复制的所有文件都将复制粘贴到单个翻译单元中,并且由于您在您之前,所以它将正常工作,因为到编译器看到的定义时struct VM_INFO
,它已经看过的定义enum _VM_TYPE
,所以您没有问题。在其中包括"export.h"
in"cpp_header.hpp"
和按此"cpp_code.cpp"
顺序包括它们之间基本上没有区别,因为预处理后最终得到的代码基本上相同。因此,您在这里要做的就是确保以正确的顺序获取包含物。
如果您希望#include "cpp_header.hpp"
不包含"export.h"
在需要访问其成员的翻译单元中struct VM_INFO
(因此不可以将其保留为不完整的类型),那么这将"export.h"
是一个错误的设计,您应该对所有内容进行定义可能需要单独放入新的标头中。如果正如评论所建议的那样,如果您绝对不能做到这一点,并且必须进行次优设计,那么您的下一个最佳选择就是拥有两个版本的"cpp_header.hpp"
,一个仅重复定义enum _VM_TYPE
,而一个不重复。你最好#include
在你做任何翻译单元的第一个版本不还#include "export.h"
,和#include
您所在的任何翻译部门的第二个版本。显然,这种类型的代码重复都会在将来引起问题。
此外,以下划线和大写字母开头的名称始终在C中保留,因此您实际上不应该使用它们。如果将来的C版本决定使用_VM_TYPE
,那么您将不得不使用过时的C版本,或者使所有这些代码中断。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句