Как написать общий макрос #define на C и написать меньше кода - PullRequest
0 голосов
/ 11 мая 2018

Допустим, у меня есть 2 набора значений для P_A, P_B, P_C, как показано ниже

#define X_P_A  2
#define X_P_B  3
#define X_P_C  4

#define Y_P_A  5
#define Y_P_B  6
#define Y_P_C  7

Существует 3 типа пользователей: - один раз, когда нужны только X-варианты, один раз - только Y-варианты, и один раз - оба.

например

#ifdef X
    #define P_A  X_P_A
    #define P_B  X_P_B
    #define P_C  X_P_C
#endif

#ifdef Y
    #define P_A  Y_P_A
    #define P_B  Y_P_B
    #define P_C  Y_P_C
#endif

Пользователи, которым нужны оба, примут решение во время выполнения и при необходимости вызовут X_P _ <> или Y_P _ <>.

Есть ли способ сделать его проще, чтобы мне не приходилось писать условные макросы для каждого поля

ifdef X
// do something magical does defines all P_<> to X_P_<>
#endif

Я знаю, это звучит глупо. Вы можете спросить, почему бы просто не использовать варианты X_P _ <> на X. Я просто пытаюсь понять, возможно ли это.

Я в порядке с изменением макроса, определенного. Возможно ли что-то похожее на приведенный ниже код: (проблема с кодом ниже в том, что компиляция не удалась, потому что #if не разрешен в #define)

#define A 1
#define B 2
#define C 3

/* Not a correct #define macro */    
#define X_P(x)    \
#if(x == A)    2  \  
#elif(x == B) 3  \ 
#elif(x == C)  4  \
#endif

#ifdef X
 #define P(x) X_P(x)
#endif

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете сделать это с одним из вариантов X-Macros:

#define IMPLEMENT(X) \
    X(P_A, 1, 5) \
    X(P_B, 2, 6) \
    X(P_C, 3, 7)

enum {
    // Just one
    #define X1_P(n, x, y) n = x,
    IMPLEMENT(X1_P)

    // Both
    #define X2_P(n, x, y) X_##n = x,
    #define Y2_P(n, x, y) Y_##n = y,
    IMPLEMENT(X2_P)
    IMPLEMENT(Y2_P)

    DUMMY // Just in case compiler is strict about trailing comma
};

, который расширится до:

enum {
    P_A = 1, P_B = 2, P_C = 3,

    X_P_A = 1, X_P_B = 2, X_P_C = 3,
    Y_P_A = 5, Y_P_B = 6, Y_P_C = 7,

    DUMMY
};
0 голосов
/ 11 мая 2018
#define X_P(x)  ((x) - 0x10 + 1) // 1 is 0x31 and A is 0x41 hence A will give 0x41 - 0x10 + 1 = 0x32
#define Y_P(y)  ((y) - 0x10 + 5) // same logic applies

Будет ли это то, что вы ищете?Не полностью отвечая на ваш вопрос, хотя

...