【发布时间】:2014-02-18 22:58:03
【问题描述】:
我搜索了前向声明,但没有找到任何使我的情况正常的方法。所以这里是:
1) 有一个C-header文件,可以说是大型多组件软件的导出接口,其中包含枚举类型定义
“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++,对吗?在 cpp_header.hpp 中只添加“enum VM_TYPE”会导致重新定义错误。
有什么想法吗?谢谢。
【问题讨论】:
-
有什么理由不在 cpp_header 中包含 export.h?似乎它无论如何都依赖于枚举。除非您使用指针/引用,否则您无法使用类/结构来执行此操作。
-
以下划线和大写字母开头的标识符总是在 C 中保留,包括在标记命名空间中,所以不要使用像
_VM_TYPE这样的东西。 -
@Andrew: (1) 这些标识符是为 C 保留的,而不是为其他库保留的,所以告诉他们他们写错了 C。 (2)
code_header.hpp也没有问题,因为您首先包含export.h。当编译器在code_header.hpp中看到任何内容时,它已经在export.h中看到了enum的定义,因为这两个文件本质上都会被复制粘贴到一个翻译单元中,按照顺序你#include他们。因此,当您的编译器到达您的struct定义时,它已经看到了您的enum的定义。 -
换句话说,在
"export.h"中包含"export.h"和在"cpp_code.cpp"中按顺序包含它们之间基本上没有区别。预处理后,您最终会得到基本相同的代码。
标签: c++ c enums declaration forward