1

C のテーブルでサイズを指定した文字列リテラルの最もエレガントな実装を探しています。要点は、コンパイル時にコンパイラに sizeof("Some String Literal") を計算させることです。

これまでのところ、次の 2 つの可能性を考えることができます (以下のコードを参照)。

  1. オプション A の場合と同様に、文字列を 2 回入力します。文字列が多く、文字列を変更する必要がある場合、入力エラーが発生する可能性があるため、これは適切な解決策ではありません。

  2. オプション B で行ったように、文字列リテラルを定義し、テーブルで使用します。

または、よりエレガントなソリューションはありますか?

#define STR_OPTION_B "Option B"

typedef struct
{
    enum {
        OPTION_A,
        OPTION_B
    } optionIDs;
    char* pString;
    int sizeOfString;
}
tTableElement;

tTableElement table[] =
{
    { OPTION_A, "Option A", sizeof("Option A") },
    { OPTION_B, STR_OPTION_B, sizeof(STR_OPTION_B) }
};
4

1 に答える 1

5

#define文字列と文字列のサイズの両方を構造体に入れるマクロを使用します。

#define STR_ENTRY(x) x, sizeof(x)
tTableElement table[] =
{
    { OPTION_A, STR_ENTRY("Option A") },
    { OPTION_B, STR_ENTRY("Option B") }
};
#undef STR_ENTRY

これは、文字通り次のように展開されます。

tTableElement table[] =
{
    { OPTION_A, "Option A", sizeof("Option A") },
    { OPTION_B, "Option B", sizeof("Option B") }
};
于 2013-03-27T19:39:11.927 に答える