C 结构合法值约束配置继承

C 结构合法值约束配置继承,c,inheritance,configuration,struct,tcl,C,Inheritance,Configuration,Struct,Tcl,为了维护和测试大量结构,并对其许多字段的合法值进行各种限制,我们正在构建一个附加结构的通用系统,该系统将描述这些项的合法值范围。挑战在于尽可能地防止代码重复,我认为一种类似继承的机制,在这种机制中,特定案例可以从更一般的父案例继承 例如,假设我们有一个通用的carstruct,合法值是(伪代码): 现在想象一下,上面提到的结构实际上包含几十个字段,并且实际描述了一些特定网络功能的配置。现在我们有一个非常类似的结构,我们只想修改其中一个约束(例如): 你知道我如何在C语言中实现这一点,从而可以轻松

为了维护和测试大量结构,并对其许多字段的合法值进行各种限制,我们正在构建一个附加结构的通用系统,该系统将描述这些项的合法值范围。挑战在于尽可能地防止代码重复,我认为一种类似继承的机制,在这种机制中,特定案例可以从更一般的父案例继承

例如,假设我们有一个通用的
car
struct
,合法值是(伪代码):

现在想象一下,上面提到的结构实际上包含几十个字段,并且实际描述了一些特定网络功能的配置。现在我们有一个非常类似的结构,我们只想修改其中一个约束(例如):

你知道我如何在C语言中实现这一点,从而可以轻松地为系统中的每个对象设置并获得具有正确合法值范围的结构吗

我需要代码中的约束的原因:

  • 它允许我们随机创建一个具有合法或错误字段值的实例,用于测试目的
  • 它将鼓励开发人员编写描述合法值范围的自文档代码
  • 这将防止大量代码重复

  • 我面临的主要挑战是c本身不支持继承。我们使用tcl编写脚本,这是一种非常灵活的方法,但我不知道如何编写通用代码来启动tcl并返回具有正确值的结构。

    C没有您在问题中描述的继承性

    我可以想出一个预处理器技巧,如果只在基本结构中添加新字段(而不是覆盖字段),则可以最大限度地减少要编写的代码量:

    #define BASE_CAR_CONSTRAINTS \
       max_speed_range ...       \
       total_weight ...          \
       door_count ...            
       .
       .
       .
    
    struct car_constraints {
       BASE_CAR_CONSTRAINTS
    };
    
    struct sports_car_constraints {
       BASE_CAR_CONSTRAINTS
       wheel_diameter_range ...
       .
       .
    };
    
    struct car-constraints {
        max-speed-range [80  - 220] //unit is in MPH
        total-weight    [0.5 - 4.0] //unit is in tons
        door-count      [2.0 - 6.0] //unit is integer
    }
    
    struct sports-car-constraints {
        struct car-constraints parent;
        max-speed-range [150  - 370] //unit is in MPH -> The original value is overriden
    }
    
    为了立即覆盖“基类”(基本结构)中的字段,为什么不使用上述方法,创建一个
    sports\u car\u约束的实例
    ,然后只覆盖字段
    max\u speed\u range

    这样你就是:

    • 不要再复制整个结构
    • 仅在“派生结构”中增量修改“基本结构”中的增量

    执行类似操作的主要方法之一是将父结构包含为子结构的第一个成员值:

    #define BASE_CAR_CONSTRAINTS \
       max_speed_range ...       \
       total_weight ...          \
       door_count ...            
       .
       .
       .
    
    struct car_constraints {
       BASE_CAR_CONSTRAINTS
    };
    
    struct sports_car_constraints {
       BASE_CAR_CONSTRAINTS
       wheel_diameter_range ...
       .
       .
    };
    
    struct car-constraints {
        max-speed-range [80  - 220] //unit is in MPH
        total-weight    [0.5 - 4.0] //unit is in tons
        door-count      [2.0 - 6.0] //unit is integer
    }
    
    struct sports-car-constraints {
        struct car-constraints parent;
        max-speed-range [150  - 370] //unit is in MPH -> The original value is overriden
    }
    
    然后,您可以安全地将
    跑车约束*
    强制转换为
    汽车约束*
    (注意:指向结构的指针!),并重用现有约束管理代码


    但是,您可能应该在real
    car constraints
    中放置一个字段,该字段包含一个指向实现real constraints checker的函数的指针,这样您就可以将如何检查约束的知识委托给代码,该代码将执行正确的操作,无论它是哪种类型。然后,只有工厂职能部门必须了解一切;代码的客户端(包括Tcl接口)可以忽略复杂性。(如果有几个这样的函数,将它们归纳成它们自己的结构;也可以在那个点正确地重新执行VTABLE…)

    < p>您可能需要考虑编写代码生成器。该方法概述如下:

  • 使用您最喜欢的配置文件语法(以及解析该语法的库),编写一个配置文件,作为您希望在C结构中包含的内容的规范

  • 编写一个代码生成实用程序,解析该配置文件,并使用print语句生成一对定义c结构的
    .h
    .c
    文件,以及获取/设置其字段和执行范围检查所需的任何支持函数

  • 您的
    Makefile
    应该运行代码生成实用程序,然后编译生成的代码以及项目的手写代码


  • 代码生成应用程序不必用C实现。相反,您可以用您认为最适合该任务的任何语言编写它。例如,由于您在项目中使用了Tcl,因此可以对上面列表中的项目1和2使用Tcl

    这就是我们将采用的解决方案。在Tcl中编写一个自动代码生成器。我可以很容易地在Tcl中实现所需的继承行为,并让它生成用于获取结构样本和定义包含相关约束的结构实例的c代码。