Как объединить с ## элемент из кортежа без использования макроса GLUE в препроцессоре C? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть большая база кода, которая выглядит так:

#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) во всей кодовой базе. Итак, я спрашиваю, есть ли какой-нибудь выход из этого без серьезных проблем с рефакторингом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...