使用不同的实现时如何编写相同的客户端文本?
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)?
仅供参考:
- 仅硬件且始终支持一个芯片。一个硬件上不可能有两个芯片。
- 一个项目可能同时包含 chip_A 和 chip_B 的代码,因为我们经常将整个文件夹从一个项目复制到另一个项目。
您需要的是 conditional-compilation ,您需要启用 CHIP_A 或 CHIP_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),或者运行时间决定(选择运行 时不同的共享库)?
我正在从事在客户端和供应商端编写代码的项目。
假设在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)?
仅供参考:
- 仅硬件且始终支持一个芯片。一个硬件上不可能有两个芯片。
- 一个项目可能同时包含 chip_A 和 chip_B 的代码,因为我们经常将整个文件夹从一个项目复制到另一个项目。
您需要的是 conditional-compilation ,您需要启用 CHIP_A 或 CHIP_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),或者运行时间决定(选择运行 时不同的共享库)?