【问题标题】:How to handle conflicting struct definitions in a C application如何在 C 应用程序中处理冲突的结构定义
【发布时间】:2015-01-09 03:07:15
【问题描述】:

我有一个应用程序可以从专有二进制格式的文件中读取数据。该公司提供带有结构的头文件,可以直接解析文件。到目前为止一切顺利。

供应商刚刚发布了一种全新的格式并提供了一组新的头文件。不幸的是(或者幸运的是,取决于您的观点),这些标头包含名称相同但定义完全不同的结构。

所以这是我的问题 - 我有两个头文件,它们定义了具有不同定义的相同结构,我的应用程序需要同时支持旧版本和新版本的文件格式。头文件有几千行,所以调整是不可行的。

在 C 中进行这项工作的最佳方法是什么?在 C++ 中,我可以将每个结构包装在命名空间中,但我不确定如何用 C 解决这个问题...

提前致谢!

【问题讨论】:

  • 为每一个创建单独的库并动态加载适当的库并调用函数。
  • @radar 不幸的是,该应用程序需要同时支持两种文件格式。我想我可以在单独的库中创建包装器函数,但我希望有一些不那么强烈的东西:)
  • 难道你不应该惊恐地尖叫并与那个优秀的供应商断绝关系吗? :)
  • 只是一个旁注。在 C++ 中,由于名称修饰,除非您可以重新编译所有源代码,否则您实际上无法做任何事情。

标签: c struct namespaces


【解决方案1】:

使用宏重命名您的头文件之一中的结构:

% 猫头1.h

#ifndef HEADER1_H
#define HEADER1_H

struct mystruct {
    int content;
};

#endif /* HEADER1_H */

% cat header2.h

#ifndef HEADER2_H
#define HEADER2_H

struct mystruct {
    char *somestring;
};

#endif /* HEADER2_H */

% cat test.c

#include <stdio.h>
#include "header1.h"

#define mystruct mystruct_hdr2
#include "header2.h"
#undef mystruct


int main(void) {
    struct mystruct one;
    struct mystruct_hdr2 two;

    one.content = 1;
    two.somestring = "test";

    printf("%d, %s\n", one.content, two.somestring);
    return 0;
}

【讨论】:

  • 请注意,标题保护的#define 应该紧跟在#ifdef 之后,而不是文件的尾部。在这里,它可能无关紧要,但总的来说,它确实如此。让代码在自己的标题中进行重命名,而不是在需要包含两个标题的文件中实现重命名 ad hoc 也是明智的。
  • @JonathanLeffler 谢谢,已修复。在我开始输入之前并没有真正注意 vim 生成了什么:)
  • @DanKruchinin 谢谢你,这给了我希望! :D 唯一的问题是我正在使用的头文件包含数百个定义。有没有办法将这种更改全局应用于头文件而不是一次一个结构?谢谢!
  • 注意这一点 - 如果结构的名称也作为函数名称或变量名称的一部分出现,您可能会遇到链接问题。
  • @PeterM 我不知道。虽然,您可以编写一个脚本来收集标题中的所有定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多