2014-02-18 58 views
8

我搜索了前向声明,并没有看到任何让我的情况有效的方法。所以在这里,它是:正向声明在C++中定义的枚举C

1)有一个C-头文件,导出接口,从而为大型多组件软件说话,包含的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++,正确吗?在cpp_header.hpp中添加“枚举VM_TYPE”会导致重定义错误。

有什么想法?谢谢。

+1

http://stackoverflow.com/questions/71416/forward-declaring-an-enum-in-c – alexbuisson

+0

任何不包括export.h在cpp_header的原因?无论如何,它似乎依赖于枚举。除非您使用指针/引用,否则您无法使用类/结构来完成此操作。 – imreal

+0

@alexbuisson我已经阅读了该线程。我明白为什么前向声明不能在C++(基础类型)中工作,但不知道我的情况是否有任何解决方法。 – Andrew

回答

1

在你的问题中描述的特定情况下,你不需要转发声明的。你所有的文件#include将基本上复制粘贴到一个单一的翻译单位编译正确的开始之前,因为你#include "export.h"之前#include "cpp_header.hpp",那么它只会工作,因为在编译器看到的定义struct VM_INFO,它已经看到了enum _VM_TYPE的定义,所以你没有问题。在"cpp_header.hpp"之间包括"export.h",并且按顺序在"cpp_code.cpp"中包括它们,因为在预处理之后最终会得到基本相同的代码,所以基本上没有区别。所以你所要做的就是确保你按照正确的顺序得到你的包装。

如果你想#include "cpp_header.hpp"没有包括在您需要访问的struct VM_INFO成员(以便把它当作一个不完整的类型不是一个选项),然后"export.h"只是设计糟糕的翻译单元"export.h",你应该将你可能需要的任何东西的定义分解成一个新的头文件。如果正如评论所暗示的那样,你完全无法做到这一点,并且需要设计一个不理想的设计,那么你的下一个最佳选择将是有两个版本的"cpp_header.hpp",一个只是重复enum _VM_TYPE的定义,而另一个则没有。你会在任何翻译单元的第一个版本而不是#include "export.h"#include第二个版本在你所在的任何翻译单位。很明显,这种类型的代码重复将来会引发问题。

另外,以下划线和大写字母开头的名字总是保留在C中,所以你真的不应该使用它们。如果未来的C版本决定使用_VM_TYPE,那么你会被卡在使用过时版本的C,或者所有代码都被破坏。

+0

好吧,看起来#includes订单不是我想象/发布的。不太简化的代码是'#include“someother.hpp”\\,其中包括“export.h”,然后是“#include”cpp_header.hpp“'。问题是''someother.hpp''还包括'cpp_header.hpp'之前的''export.h“'...所以顺序是颠倒的。必须查看是否可以在不破坏任何现有代码的情况下进行更改... – Andrew

+0

您的想法应该从我最初发布的内容开始。不幸的是,还有其他部分失败......即该组件内的其他文件,其中只包含'cpp_header.hpp',而不包含'export.h'。因此编译所有这些文件时'VM_TYPE'是未定义的。 – Andrew

+0

然后你需要重新设计。简单而明显的答案就是通过包含''export.h'''或​​从''cpp_header.hpp''中删除'struct'定义来反映你如何使用它们的内容来编写/修改你的头文件。 '并把它放在一个单独的标题中。如果出于某种神秘的原因,只有您的雇主才知道您不允许正确书写C,那么您要么按照答案中提供的方式需要某种重复的解决方法,要么您需要放弃您的计划雇主显然不希望根据他们的设计。 –

0

枚举不能转发声明,因为编译器需要知道枚举的大小。底层枚举器是编译器特定的,但通常是int。你可以将枚举抛出int吗?

“我可能是和经常是错的”