UI テキストを 1 つの配列に簡単に格納できるプリプロセッサ定義がいくつかあります (以下を参照)。また、他の言語のサポートも煩雑になりません。
#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 を占有します。プログラム内の 2 つの大きな文字列テーブルが、使用可能な RAM の約 30% を占めています。したがって、これは無視できません。
enum 値が、コード空間に格納された 1 つの大きな const char 文字列内の null で終わる部分文字列の開始位置である場合、RAM の依存関係はゼロになります。
すなわち:
menu_sztable[] = "One\0Two\0Three\0Press Enter\0";
STR_ONE -> 0
STR_TWO -> 4
STR_Three -> 8
STR_PressEnter -> 14
これを行うために C プリプロセッサを使用する賢い方法はありますか? 列挙型を手動で作成したり、配列を変換するビルド前のコマンド プログラムを作成したりする必要はありません。