gpt4 book ai didi

c++ - 如何包含同一 header 的两个不同版本?

转载 作者:行者123 更新时间:2023-12-02 03:45:35 25 4
gpt4 key购买 nike

我正在编写从专有文件格式到更通用的文件转换代码。我的目标是支持制造商文件格式的多个版本。

我有相同专有 header 的多个版本。 header 定义了构成主文件 header 的各种结构(该文件只是一个大 header ,后面跟着原始数据)。

我需要读取源文件的前 4 个字节来确定文件版本。文件版本又告诉我使用哪个版本的 C 结构来创建文件。

问题是:

  1. 我无法修改专有 header
  2. header 不使用命名空间或类
  3. header 中定义了很多宏

可能的解决方案:

  • 为每个文件版本类型构建不同的转换器二进制文件:-(
    • 对用户和开发者来说都不方便
  • 动态加载每个版本的库
    • 转换器是面向插件的,因此已经发生了很多这样的事情

我尝试过使用命名空间进行黑客攻击:

namespace version1 {
#include "version1.h"
}

namespace version2 {
#include "version2.h"
}

int main (void) {
version1::header *hdr = new version1::header;
return 0;
}

但是由于包含保护,并且每个 header 中重新定义了多个宏,因此这不起作用。

有没有一种优雅的方式来处理这个问题?

最佳答案

您可以使用两个不同的源文件以及前向声明:

// 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_v1.cpp:

#include "header1.h"

int header_v1::func1(char *stuff)
{
...
return 17;
}

header_v2.h 和 header_v2.cpp 也类似。

关于c++ - 如何包含同一 header 的两个不同版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com