And*_*rew 8 c c++ enums declaration forward
我搜索了前方声明,并没有看到任何方法让我的情况有效.所以这里是:
1)有一个C头文件,一个导出接口,可以说是一个包含枚举类型的大型多组件软件
"export.h":
// This is in "C"!
typedef enum _VM_TYPE {...., ...., ...,} VM_TYPE;
Run Code Online (Sandbox Code Playgroud)
2)C++中的部分代码使用该导出.
"cpp_code.cpp":
// This is in C++
#include "export.h"
#include "cpp_header.hpp"
{ .... using VM_TYPE values to do stuffs....}
Run Code Online (Sandbox Code Playgroud)
"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
....
};
Run Code Online (Sandbox Code Playgroud)
很明显,问题出在cpp_head.hpp中,因为它不知道枚举.
我尝试添加到cpp_header.hpp
typedef enum _VM_TYPE VM_TYPE;
Run Code Online (Sandbox Code Playgroud)
它实际上会起作用.那为什么这个有用呢?因为它有C风格的语法?!无论如何,我被告知不要通过上层"管理"这样做("它是C++,而不是C").
是否还有其他方法可以根据当前的事物联系方式完成这项工作?他们不想更改/添加包含文件; "枚举类"只是c ++,对吗?仅将"enum VM_TYPE"添加到cpp_header.hpp将会出现有关重新定义的错误.
任何的想法?谢谢.
在您问题中描述的特定情况下,您根本不需要转发声明。#include在编译开始之前,您基本上要复制粘贴到单个翻译单元中的所有文件,并且由于您在您#include "export.h" 之前#include "cpp_header.hpp",所以它会正常工作,因为当编译器看到 的定义时struct VM_INFO,它已经已经看过 的定义enum _VM_TYPE,所以你没有问题。"export.h"include 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 版本,要么让所有这些代码都被破坏。