使用宏定义结构和 str 字典
Defining a struct along with a str dictionary using a macro
我正在尝试在我的代码中自动生成结构,其语法由 Midas Library 指定。这里的难点在于并行构建 const char*
模仿结构定义的字典:
typedef struct {
BOOL runColdStartScript;
BOOL runPedestalScript;
BOOL triggerCommunicationTest;
BOOL updateOdbParameters;
BOOL runCmdBuffer;
BOOL runSelectedScript;
} myHotLink;
myHotLink hotLinkContainer{};
const char *hot_links_str[9] = { \
"[.]", \
"runColdStartScript = BOOL : n", \
"runPedestalScript = BOOL : n", \
"triggerCommunicationTest = BOOL : n", \
"updateOdbParameters = BOOL : n", \
"runCmdBuffer = BOOL : n", \
"runSelectedScript = BOOL : n", \
"", nullptr
};
理想情况下,我想用宏生成这段代码。例如:
MAKE_HOT_LINK(
myHotLink,
{ BOOL, runColdStartScript, n },
{ BOOL, runPedestalScript, n },
...
)
有人知道如何定义(并正确调用)MAKE_HOT_LINK
宏吗?
干杯!
您可以使用一些元宏来定义您想要的字段,以及一些将这些扩展到声明和描述符的其他宏:
#define MYHOTLINK_FIELDS(M) \
M(BOOL, runColdStartScript, n) \
M(BOOL, runPedestalScript, n) \
M(BOOL, triggerCommunicationTest, n) \
M(BOOL, updateOdbParameters, n) \
M(BOOL, runCmdBuffer, n) \
M(BOOL, runSelectedScript, n) \
#define FIELD_DECL(TYPE, NAME, TAG) TYPE NAME;
#define FIELD_DESCRIPTOR(TYPE, NAME, TAG) #NAME " = " #TYPE " : " #TAG,
#define DECLARE_STRUCT(STYPE) struct { STYPE(FIELD_DECL) }
#define STRUCT_DESCRIPTOR(STYPE) { "[.]", STYPE(FIELD_DESCRIPTOR) "", nullptr }
typedef DECLARE_STRUCT(MYHOTLINK_FIELDS) myHotLink;
myHotLink hotLinkContainer {};
const char *hot_links_str[] = STRUCT_DESCRIPTOR(MYHOTLINK_FIELDS);
会扩展到(等同于)您上面的内容。
我正在尝试在我的代码中自动生成结构,其语法由 Midas Library 指定。这里的难点在于并行构建 const char*
模仿结构定义的字典:
typedef struct {
BOOL runColdStartScript;
BOOL runPedestalScript;
BOOL triggerCommunicationTest;
BOOL updateOdbParameters;
BOOL runCmdBuffer;
BOOL runSelectedScript;
} myHotLink;
myHotLink hotLinkContainer{};
const char *hot_links_str[9] = { \
"[.]", \
"runColdStartScript = BOOL : n", \
"runPedestalScript = BOOL : n", \
"triggerCommunicationTest = BOOL : n", \
"updateOdbParameters = BOOL : n", \
"runCmdBuffer = BOOL : n", \
"runSelectedScript = BOOL : n", \
"", nullptr
};
理想情况下,我想用宏生成这段代码。例如:
MAKE_HOT_LINK(
myHotLink,
{ BOOL, runColdStartScript, n },
{ BOOL, runPedestalScript, n },
...
)
有人知道如何定义(并正确调用)MAKE_HOT_LINK
宏吗?
干杯!
您可以使用一些元宏来定义您想要的字段,以及一些将这些扩展到声明和描述符的其他宏:
#define MYHOTLINK_FIELDS(M) \
M(BOOL, runColdStartScript, n) \
M(BOOL, runPedestalScript, n) \
M(BOOL, triggerCommunicationTest, n) \
M(BOOL, updateOdbParameters, n) \
M(BOOL, runCmdBuffer, n) \
M(BOOL, runSelectedScript, n) \
#define FIELD_DECL(TYPE, NAME, TAG) TYPE NAME;
#define FIELD_DESCRIPTOR(TYPE, NAME, TAG) #NAME " = " #TYPE " : " #TAG,
#define DECLARE_STRUCT(STYPE) struct { STYPE(FIELD_DECL) }
#define STRUCT_DESCRIPTOR(STYPE) { "[.]", STYPE(FIELD_DESCRIPTOR) "", nullptr }
typedef DECLARE_STRUCT(MYHOTLINK_FIELDS) myHotLink;
myHotLink hotLinkContainer {};
const char *hot_links_str[] = STRUCT_DESCRIPTOR(MYHOTLINK_FIELDS);
会扩展到(等同于)您上面的内容。