我有一些预处理器定义,可以轻松地将 UI 文本存储在单个数组中(见下文)。也使支持其他语言变得不那么麻烦。
#define DECLARE_STRING_ENUM_FST(name, value) name
#define DECLARE_STRING_ENUM_SND(name, value) value
#define DECLARE_STRING_ENUM(name, macro) \
typedef enum name { macro(DECLARE_STRING_ENUM_FST) } name; \
static const char* name##_sztable[] = { macro(DECLARE_STRING_ENUM_SND) }; \
// this is a string table usage
#define MSG_ENUM_(X) \
X(STR_ONE, "One"), \
X(STR_TWO, "Two"), \
X(STR_THREE, "Three"), \
X(STR_PRESS_ENTER, "Press Enter")
// the actual declaration is here
DECLARE_STRING_ENUM(menu, MSG_ENUM_)
结果是一个字符串数组和一个表示数组索引的枚举。
但是,由于它是一个指向常量 char* 的指针数组,因此它占用了在该设备上非常稀缺的 ram。程序中的几个大字符串表占用了大约 30% 的可用 RAM。所以这一点不容忽视。
如果枚举值是存储在代码空间中的一个大 const char 字符串中以 null 结尾的子字符串的起始位置,则 RAM 的依赖性将变为零。
IE:
menu_sztable[] = "One\0Two\0Three\0Press Enter\0";
STR_ONE -> 0
STR_TWO -> 4
STR_Three -> 8
STR_PressEnter -> 14
有没有一种聪明的方法来使用 C 预处理器来做这个?我想避免手动构建枚举或必须编写一个转换数组的预构建命令程序。