在C中定义的C ++中向前声明枚举

安德鲁

我搜索了前向声明,但没有找到使我的处境正常的任何方法。所以这里是:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在枚举中声明常量

来自分类Dev

无法在枚举中声明“ div”

来自分类Dev

遍历Java中声明的枚举

来自分类Dev

如何在Python中向前声明/原型化函数?

来自分类Dev

函数定义与C中的声明不匹配,但在C ++中

来自分类Dev

如何在python中定义C枚举类型

来自分类Dev

C ++在类中声明静态枚举vs枚举

来自分类Dev

在C ++中声明枚举而不膨胀名称空间的好方法

来自分类Dev

在C中声明vs定义变量

来自分类Dev

在C中声明结构而不定义它

来自分类Dev

在枚举之间选择还是在C中定义?

来自分类Dev

类中声明的枚举的默认值

来自分类Dev

ISO C ++禁止向前引用“枚举”类型

来自分类Dev

C ++中的部分向前声明

来自分类Dev

在C中向前链接链表

来自分类Dev

在C中定义矩阵

来自分类Dev

Typescript中的枚举的多个键声明

来自分类Dev

是否有理由在C ++中向前声明main

来自分类Dev

在lua中,有向前声明吗?

来自分类Dev

在C中定义一个枚举

来自分类Dev

C ++中类的定义

来自分类Dev

如何确定在C#中声明的枚举项数

来自分类Dev

在Eclipse中打开Java枚举方法声明

来自分类Dev

无法在枚举中声明“ div”

来自分类Dev

如何在C#中声明枚举

来自分类Dev

使用typedef的struct中的C枚举定义

来自分类Dev

在C中定义结构

来自分类Dev

定义错误中的C ++枚举

来自分类Dev

如何使枚举XSD在JAXB中向前兼容