如何包含同一标头的两个不同版本
How to include the two different versions of the same header?
我正在编写从专有文件格式到另一种通用文件格式的文件转换代码。我的目标是支持制造商文件格式的多个版本。
我有多个版本的相同的专有标头。标头定义了各种结构,这些结构包括主文件标头(文件只是一个大标头,后面跟着原始数据)。
我需要读取源文件的前4个字节来确定文件版本。文件版本,反过来,告诉我哪个版本的C指令被用来创建文件。
问题是:
- 我无法修改专有标头
- 标头不使用命名空间或类
- 标头中定义了大量宏
可能的解决方案:
- 为每个文件版本类型生成不同的转换器二进制文件:-(
- 用户和开发人员都不方便
- 为每个版本动态加载库
- 转换器是面向插件的,所以已经发生了很多这样的事情
我尝试过使用名称空间进行黑客攻击:
namespace version1 {
#include "version1.h"
}
namespace version2 {
#include "version2.h"
}
int main (void) {
version1::header *hdr = new version1::header;
return 0;
}
但这不会起作用,因为包含保护,而且每个标头中都有多个宏被重新定义。
有没有一种优雅的方法来处理这个问题?
您可以使用两个不同的源文件,以及一个前向声明:
// Forward declare in main.cpp:
namespace version1
{
struct header;
}
namespace version2
{
struct header;
}
// version1.cpp:
namespace version1
{
#include <version1.h>
}
version1::header* new_v1_header()
{
return new version1::header;
}
// other functions using `version1::header`
// version2.cpp:
namespace version2
{
#include <version2.h>
}
version2::header* new_v2_header()
{
return new version2::header;
}
// other functions using `version2::header`
另一种选择是实现一个包装类,它有一个基类,它只是一个空壳:
class header_base
{
virtual int func1(char *stuff) = 0;
... many other virtual functions.
};
// Create implementation of header_v1 or header_v2:
header_base* make_header(unsigned int magic);
header_base.cpp:
#include "header_v1.h"
#include "header_v2.h"
header_base* make_header(unsigned int magic)
{
switch(magic)
{
case Magic_V1:
return new header_v1;
case Magic_V2:
return new header_v2;
default:
assert(0);
return 0;
}
}
然后在两个独立的中实现
在headerv1.h:中
class header_v1 : public header_base
{
int func1(char *stuff);
...
};
header_v.cpp:
#include "header1.h"
int header_v1::func1(char *stuff)
{
...
return 17;
}
类似于header_v2.h和header_v.cpp.
相关文章:
- 为什么这两个版本的代码给出不同的输出
- 如何在两个版本之间从perforce差异获取C/C 函数名称
- 我真的需要两个版本的==操作员超载吗?
- 这两个版本的代码有什么区别
- 同一个应用程序中的同一库的两个版本
- 基于布尔标志有效地派生公共函数的两个版本
- 特征 'sum()' 函数在两个版本的程序中给出不同的相同向量
- c++ 编译器优化是否可以针对布尔参数生成两个版本的函数
- 为什么这两个版本的快速排序在进行比较的次数上存在巨大差异
- 调试:跟踪(和diffing)同一程序的两个版本的函数调用树
- C++堆栈实现 - 两个版本的 top 方法
- 如何静态链接到两个版本的 xerces-c(或任何与此相关的库)
- C++检查两个版本的函数
- 为什么同一服务器的两个版本的行为不同?
- 两个版本的[]操作符用于右值和左值情况
- 用于比较给定两个源代码文件的同一c++函数的两个版本的工具
- c++两个版本的重载下标操作符
- 当我包含一个共享库时,我的可执行文件正在寻找它的两个版本
- 为什么矢量模板函数赋值有两个版本可以区分
- 避免使用"const X&"和"X&"的两个版本的函数