使用##运算符创建宏

Ana*_*and 2 c concatenation

抱歉,我可能会重复之前提出的问题,但我没有得到我正在寻找的答案。所以这就是我想要创建的:

typedef struct flags
{
    unsigned char flag0:1;
    unsigned char flag1:1;
    unsigned char flag2:1;
    unsigned char flag3:1;
    unsigned char flag4:1;
    unsigned char flag5:1;
    unsigned char flag6:1;
    unsigned char flag7:1;
}BFLAG;

typedef union
{
    unsigned char byte;
    BFLAG  bitflg;
}GENFLAG;

GENFLAG status_flag, hmi_flag;
Run Code Online (Sandbox Code Playgroud)

然后我想创建宏来寻址特定位,如下所示:

#define EDIT_PARAM      status_flag.bitflg.flag0    // l: Locked for editing, 0:Editable

#define HIDE_PARAM      status_flag.bitflg.flag1    // 1: parameter is hidden, 0:visible

#define LOCK_PARAM      hmi_flag.bitflg.flag0   // 1: Password Unlock, 0: locked 1.
Run Code Online (Sandbox Code Playgroud)

ETC。

因此,我希望能够在每个实例中使用 ## 运算符将“status_flag.bitflg.flag”等公共字符串与 0、1、2、3 等连接起来,创建一个新的宏。但我想使用宏,例如 EDIT_INDEX 代表 0,HIDE_INDEX 代表 1 等。

#define EDIT_INDEX  0
#define HIDE_INDEX  1
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接在宏中使用它,例如

#define CONCAT(x, y)    x##y
#define EDIT_PARAM    CONCAT(status_flag.bitflg.flag, EDIT_INDEX)
Run Code Online (Sandbox Code Playgroud)

我得到的只是左侧字符串与 EDIT_INDEX 作为字符串的串联,而不是扩展宏

status_flag.bitflg.flag0

如果我想让它创建如上所示的扩展,我该怎么办?任何和所有的帮助将由衷感谢。很抱歉,如果我的问题陈述被发现有问题。

我尝试了以下方法

#define CONCAT(x, y)    x##y
#define EDIT_PARAM    CONCAT(#status_flag.bitflg.flag, EDIT_INDEX)
Run Code Online (Sandbox Code Playgroud)

它给出的输出为“status_flag.bitflg.flagEDIT_INDEX”,而不是预期的“status_flag.bitflg.flag0”。

d3L*_*d3L 5

这是 C 中宏扩展的一个已知限制。

通常可以通过使用以下方法来解决:

#define CONCAT1(x, y)    x##y
#define CONCAT(x, y)     CONCAT1(x, y)
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

#define CONCAT(x, y)    x##y
Run Code Online (Sandbox Code Playgroud)

解释:

CONCAT()和的组合CONCAT1()使预处理器在连接它们之前先x评估和。y