gpt4 book ai didi

c - 有没有办法用 C 语言的宏设置来做通用代码?

转载 作者:行者123 更新时间:2023-12-01 13:16:36 25 4
gpt4 key购买 nike

我有一个管理很多不同产品的代码。变量及其特性由 X 宏设置。

产品的 5 个功能(共 10 个)具有相同的过程,但前缀和宏不同。

我想将这些函数作为通用函数。

文件 product_1.c

void product_1_init(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_A;
PRODUCT1_XMACRO_LOCAL_DATA
PRODUCT1_XMACRO_UART_DATA
#undef DATA
}

void product_1_format_data_uart(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_B;
PRODUCT1_XMACRO_UART_DATA
#undef DATA
}
...

文件 product_2.c

void product_2_init(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_A;
PRODUCT2_XMACRO_LOCAL_DATA
PRODUCT2_XMACRO_UART_DATA
#undef DATA
}

void product_2_format_data_uart(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_B;
PRODUCT2_XMACRO_UART_DATA
#undef DATA
}
...

我想知道是否可以做这样的事情:

文件 product_generic.c

#define PRODUCT_FUNC(name) PRODUCT_FUNC_(PRODUCT_GEN_NAME, name)
#define PRODUCT_FUNC_(prefix, name) PRODUCT_FUNC__(prefix, name)
#define PRODUCT_FUNC__(prefix, name) prefix ## name

void PRODUCT_FUNC(_init)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_A;
PRODUCT_GEN_XMACRO_LOCAL_DATA
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}

void PRODUCT_FUNC(_format_data_uart)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_B;
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}
...
//put here every function with process in commun to every product

文件 product_1.c

#define PRODUCT_GEN_NAME product_1
#define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT1_XMACRO_LOCAL_DATA
#define PRODUCT_GEN_XMACRO_UART_DATA PRODUCT1_XMACRO_UART_DATA

#include "product_generic.c" /*doesn't work*/

#undef PRODUCT_GEN_NAME
#undef PRODUCT_GEN_XMACRO_LOCAL_DATA
#undef PRODUCT_GEN_XMACRO_UART_DATA

文件 product_2.c

#define PRODUCT_GEN_NAME product_2
#define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT2_XMACRO_LOCAL_DATA
#define PRODUCT_GEN_XMACRO_UART_DATA PRODUCT2_XMACRO_UART_DATA

#include "product_generic.c" /*doesn't work*/

#undef PRODUCT_GEN_NAME
#undef PRODUCT_GEN_XMACRO_LOCAL_DATA
#undef PRODUCT_GEN_XMACRO_UART_DATA

我的主要问题是如何在我的不同产品文件中“#include product_generic.c”。

编译器不想包含“.c”文件,我们不能将函数放在“.h”文件中。

最佳答案

PRODUCT_GEN_XMACRO_LOCAL_DATA 的宏替换应该可以,但是 void PRODUCT_GEN_NAME ## _init(void* p_generic_ptr)没有。

您可以使用 ##仅在预处理器宏内部,并且至少要连接的部分之一必须是宏参数。

_文件 product_generic.c_

/* add fixed PRODUCT_GEN_NAME as prefix */
#define PRODUCT_FUNC(name) PRODUCT_FUNC_(PRODUCT_GEN_NAME, name)
/* next macro call necessary to get PRODUCT_GEN_NAME expanded before ## */
#define PRODUCT_FUNC_(prefix, name) PRODUCT_FUNC__(prefix, name)
/* and finally concatenate the parts */
#define PRODUCT_FUNC__(prefix, name) prefix ## name

/* you could also use the second macro here */
/* void PRODUCT_FUNC_(PRODUCT_GEN_NAME,_init)(void* p_generic_ptr) */
void PRODUCT_FUNC(_init)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_A;
PRODUCT_GEN_XMACRO_LOCAL_DATA
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}

void PRODUCT_FUNC(_format_data_uart)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_B;
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}
...
//put here every function with process in commun to every product

已添加到问题中的第二个问题的建议解决方案

如果既不允许包含 C 文件也不允许在头文件中定义函数,则可以使用单个文件 product_generic.c包含 #include "product_definitions.h"并使用具有相同名称但位于不同位置的产品特定包含文件

product_1/product_definitions.h
product_2/product_definitions.h
...

结合使用不同包含目录和不同输出文件的产品特定编译命令。像这样

cc -I product_1 product_generic.c -o product_1.c
cc -I product_2 product_generic.c -o product_2.c
...

_文件 product_generic.c_

#include "product_definitions.h"

/* add fixed PRODUCT_GEN_NAME as prefix */
#define PRODUCT_FUNC(name) PRODUCT_FUNC_(PRODUCT_GEN_NAME, name)
/* next macro call necessary to get PRODUCT_GEN_NAME expanded before ## */
#define PRODUCT_FUNC_(prefix, name) PRODUCT_FUNC__(prefix, name)
/* and finally concatenate the parts */
#define PRODUCT_FUNC__(prefix, name) prefix ## name

void PRODUCT_FUNC(_init)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_A;
PRODUCT_GEN_XMACRO_LOCAL_DATA
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}

void PRODUCT_FUNC(_format_data_uart)(void* p_generic_ptr)
{
#define DATA(v1,...,v20) PROCESS_B;
PRODUCT_GEN_XMACRO_UART_DATA
#undef DATA
}
...
//put here every function with process in commun to every product

_file product_1/product_definitions.h_

#define PRODUCT_GEN_NAME product_1
#define PRODUCT_GEN_XMACRO_LOCAL_DATA PRODUCT1_XMACRO_LOCAL_DATA
#define PRODUCT_GEN_XMACRO_UART_DATA PRODUCT1_XMACRO_UART_DATA

关于c - 有没有办法用 C 语言的宏设置来做通用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54252126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com