使用不同的实现时如何编写相同的客户端文本?

How to write same client text when using different implementation?

我正在从事在客户端和供应商端编写代码的项目。

假设在project_A中我选择chip_A,在project_B中我选择chip_B。 chip_A 和 chip_B 都提供相似的功能。

接下来我把chip_A和chip_B分别封装成模块

chip_a.h

typedef sturct
{
    uint8_t element1;
    uint8_t element2;
    ...
    uint8_t element8;
    uint8_t element9;
}chip_a_t;


bool chip_a_get_element1(chip_a_t* me);
bool chip_a_get_element2(chip_a_t* me);
...
bool chip_a_get_element8(chip_a_t* me);
bool chip_a_get_element9(chip_a_t* me);

chip_b.h

typedef sturct
{
    uint8_t element_a;
    uint8_t element_b;
    ...
    uint8_t element_y;
    uint8_t element_z;
}chip_b_t;


bool chip_b_get_element_a(chip_b_t* me);
bool chip_b_get_element_b(chip_b_t* me);
...
bool chip_b_get_element_y(chip_b_t* me);
bool chip_b_get_element_z(chip_b_t* me);

假设程序代码需要一个element_123(对于chip_A是element_1和element_8的组合,对于chip_B是element_a、element_b、element_y 和 element_z),即使在不同的项目中,程序文本也始终相同;项目之间的区别只是芯片的选择。

program.c

agent_t agent = {0};
if (agent_get_element_123(&agent) != true) {return;}
uint8_t data = agent.element_123 + some_data;

/*do other things...*/

如果我这样编码 agent.c

/*agent.c*/

bool agent_get_element_123(agent_t* me)
{
    chip_a_t chip_a = {0};
    if ((chip_a_get_element1(&chip_a) != true)
     || (chip_a_get_element8(&chip_a) != true))
    {
        return false;
    }
    
    me->element_123 = chip_a.element1 + chip_a.element8;
    
    return true;
}

我将代理模块绑定到chip_a模块,代理模块仅适用于project_A;将代理模块绑定到 chip_b 仅适用于 project_B.

有没有办法为不同的项目编写相同的客户端文本 (agent.c)?

仅供参考:

  1. 仅硬件且始终支持一个芯片。一个硬件上不可能有两个芯片。
  2. 一个项目可能同时包含 chip_A 和 chip_B 的代码,因为我们经常将整个文件夹从一个项目复制到另一个项目。

您需要的是 conditional-compilation ,您需要启用 CHIP_ACHIP_B[= 的配置20=] 编译时.

假设如果你想为CHIP_A编译,那么

/* can be done in many ways, used this for simplicity */
#define CHIP_A TRUE 
function()
{
    /* common code */

    #ifdef CHIP_A
    /* CHIP_A related code */
    #endif /* CHIP_A */
    
    #ifdef CHIP_B
    /* CHIP_B related code */
    #endif /* CHIP_B */

    /* common code */
}

SO 有很多方法可以处理这样的事情,其中​​很多取决于您到底想做什么以及您的限制是什么。

比如芯片之间的接口是不是一样的,所以agent.c里面的代码是一样的,只是函数名不同而已?然后你可以把你所有的筹码写成你想要的任何一个都有相同的 API 和 link。

如果代码不同,是否可以引入一个更高级别的接口,在所有芯片上提供类似的 API?那你可以让每个芯片都提供这个接口,把agent.c写到那个接口上。

你可以有一个函数指针数组,每个芯片用它们的函数填充它,然后agent.c会选择那个数组中的元素并调用函数。

您可以创建多个共享库,每个芯片一个,然后 agent.c 使用 dlopen() 选择正确的共享库并使用 dlsym() 获取函数指针。

是否要选择使用哪个芯片是编译时间决定(使用预处理器选项来选择),link时间决定(link在不同目标文件中具有相同的API),或者运行时间决定(选择运行 时不同的共享库)?