У меня есть большая база кода, которая выглядит так:
#define LIB_TUP_0_(A, B, C) A
#define LIB_TUP_0(TUP) LIB_TUP_0_ TUP
#define LIB_TUP_1_(A, B, C) B
#define LIB_TUP_1(TUP) LIB_TUP_1_ TUP
#define LIB_TUP_2_(A, B, C) C
#define LIB_TUP_2(TUP) LIB_TUP_2_ TUP
#define LIB_PARAM_PFX LIB_TUP_0
#define LIB_PARAM_T LIB_TUP_1
#define LIB_PARAM_NAME LIB_TUP_2
#define F(PARAM) \
F_(LIB_PARAM_PFX(PARAM), LIB_PARAM_T(PARAM))
#define FS(PARAM) \
FS_(LIB_PARAM_T(PARAM), LIB_PARAM_PFX(PARAM), LIB_PARAM_NAME(PARAM))
#define F_(PFX, T) \
T PFX##_hello(T a);
#define FS_(T, PFX, NAME) \
T PFX##_hello(T NAME) { return NAME; }
с определением заголовка F
и определением источника FS
для многих вещей.
проблема в том, что PARAM
- это (новый) стандартный способ предоставления параметров для всей библиотеки, и он должен быть кортежем в форме (PFX, T, NAME)
. Однако некоторым макросам требуются только определенные параметры из этого кортежа или их нужно передавать в другом порядке. способ не использовать его ...
Это нежелательный, но рабочий пример:
#define LIB_GLUE(a, b) a##b
#define LIB_TUP_0_(A, B, C) A
#define LIB_TUP_0(TUP) LIB_TUP_0_ TUP
#define LIB_TUP_1_(A, B, C) B
#define LIB_TUP_1(TUP) LIB_TUP_1_ TUP
#define LIB_TUP_2_(A, B, C) C
#define LIB_TUP_2(TUP) LIB_TUP_2_ TUP
#define LIB_PARAM_PFX LIB_TUP_0
#define LIB_PARAM_T LIB_TUP_1
#define LIB_PARAM_NAME LIB_TUP_2
#define F(PARAM) \
F_(LIB_PARAM_PFX(PARAM), LIB_PARAM_T(PARAM))
#define FS(PARAM) \
FS_(LIB_PARAM_T(PARAM), LIB_PARAM_PFX(PARAM), LIB_PARAM_NAME(PARAM))
#define F_(PFX, T) \
T LIB_GLUE(PFX, _hello)(T a);
#define FS_(T, PFX, NAME) \
T LIB_GLUE(PFX, _hello)(T NAME) { return NAME; }
#define M (l, int, b)
F((l, int, ))
FS(M)
Нежелательно, потому что я не могу (возможно) позволить себе менять каждые PFX##_hello
до LIB_GLUE(PFX, _hello)
во всей кодовой базе. Итак, я спрашиваю, есть ли какой-нибудь выход из этого без серьезных проблем с рефакторингом.