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