【问题标题】:Code / algorithm that can order structures in C header file correctly可以正确排序 C 头文件中的结构的代码/算法
【发布时间】:2022-11-10 17:23:29
【问题描述】:

正如我们所知,C 头文件中的结构顺序很重要。 以下将导致编译错误:

struct a {
    int i;
    struct b;
}

struct b {
   int x;
   int y;
}

当编译器处理“a”时,“b”不存在。

任务: 我有一个自动生成的 C 头文件,里面装满了像这样的问题。 我必须想出一个脚本(任何东西)来正确地重新排序这些结构。 注意:结构嵌套的最大深度是未知的(一个结构有一个结构有一个结构等等。)

我想知道对此进行排序的最快方法是什么? 谢谢,

最后,我的代码必须生成一个无错误的标头。

【问题讨论】:

  • 是否可以修复自动生成工具以执行您想要的操作?解析和更改 C++ ode 可能会更加困难。
  • 根据您需要为这个自动生成的文件处理多少 C 语言,您可以使用基本模式匹配来解析它。足以确定结构名称、嵌套和用法。从那里构建一个依赖图将相当简单,您可以使用深度优先或拓扑遍历对其进行排序。前提是没有循环依赖。
  • 生成器如何确保没有像struct a { struct b x; }; struct b { struct a x; }; 这样的循环引用?在您的问题中讲述有关生成器和数据源的详细信息可能有助于找到解决方案。
  • Yksisarvinen 说的是解析很难,代码生成前后不是同一个问题。另一方面,根据定义,产生非法代码的代码生成器是一个错误。你为什么不修复错误?
  • 这里最快的解决方案是一开始就不要产生垃圾 C 代码。无论生成什么,都应该知道它正在发出什么,并且应该能够使用简单的依赖检查对它们进行排序。

标签: python c++ c sorting header


【解决方案1】:

在 C 代码中,一个简单的实现可能是:

传递文件并使用以下结构构建文件中定义的结构列表:

struct struct_definition
{
    char* name;
    char* definition;  // The textual definition of the struct so it can be written to file later
    int number_of_unknow_dependencies;
    char** depends_on;   // e.g. a jagged array of names of first level struct dependencies
};

在解析期间,您注册结构可能具有的所有第一级依赖项(无需处理嵌套依赖项)。保存依赖项的名称并保持计数,即递增number_of_unknow_dependencies

文件通过后:

步骤1:

浏览结构列表并查找具有零依赖关系的结构,即number_of_unknow_dependencies == 0。这些可以添加到结果文件中并从结构列表中删除。此外,您将它们添加到已知结构列表.

第2步:

然后再次遍历结构列表并检查依赖于已知结构列表中一个(或多个)结构的支柱。当找到这样的结构时,您减少number_of_unknown_dependencies。完成后清除已知结构的列表。

现在您可以重复第 1 步和第 2 步,直到结构列表(即尚未写入结果文件的结构)为空。

这可能(很可能)不是最佳实现,但我希望它没问题,因为我预计(强制性)文件 IO 将是缓慢的部分。而且实现起来非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2011-11-27
    • 2018-05-26
    • 2012-04-19
    • 1970-01-01
    • 2017-08-18
    • 2010-11-15
    相关资源
    最近更新 更多