Подстановка макроса для PRODUCT_GEN_XMACRO_LOCAL_DATA
должна работать, но void PRODUCT_GEN_NAME ## _init(void* p_generic_ptr)
- нет.
Вы можете использовать ##
только внутри макроса препроцессора, и хотя бы одна из частей, которые должны быть объединены, должна быть аргументом макроса.
_file 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
...
_file 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