如何在 C 中编写通用 #define 宏并编写更少的代码

Par*_*val 5 c c-preprocessor preprocessor-directive

假设我有 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
Run Code Online (Sandbox Code Playgroud)

有 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
Run Code Online (Sandbox Code Playgroud)

需要两者的用户将在运行时做出决定并根据需要调用 X_P_<> 或 Y_P_<>。

有没有办法让它更简单,这样我就不必为每个字段编写条件宏

ifdef X
// do something magical does defines all P_<> to X_P_<>
#endif
Run Code Online (Sandbox Code Playgroud)

我知道这听起来很愚蠢。您可能会问为什么不直接在 X 上使用 X_P_<> 变体。我只是想了解是否可能。

我可以改变宏定义的方式。是否可能类似于以下代码:(以下代码的问题是编译失败,因为 #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
Run Code Online (Sandbox Code Playgroud)

Ant*_*REL 1

#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
Run Code Online (Sandbox Code Playgroud)

这会是您正在寻找的吗?虽然没有完全回答你的问题

  • 不要忘记在“x”和“y”以及正在定义的整个表达式周围添加括号。 (2认同)