C99(とりわけ)配列イニシャライザはそうよう、例えば、配列の要素は正の整数指定子($ 6.7.8.6、$ 6.7.8.17)で設定されている指定することができ:デジグネータ
const char *foo[] = {[2] = "foo", [1] = "bar", [0] = "baz"};
私は、以前のようなので、列挙型からストリングテーブルを作るために、これを使用しています
enum {THING_FOO = 0, THING_BAR, THING_BAZ};
const char *table[] = {
[THING_FOO] = "foo",
[THING_BAR] = "bar",
[THING_BAZ] = "baz"
}
しかし、私は今、私のコードはC89に準拠している要件の下で働いています。
私はプリプロセッサの魔法を調べましたが(例えばhereのように)、列挙型シンボルのコピーではなく、任意の文字列が必要です。
私は将来的に列挙型の要素を追加する必要がありますので、ちょうど
enum {THING_FOO = 0, THING_BAR, THING_BAZ};
const char *table[] = {"foo", "bar", "baz"};
を行うのに十分ではありません。 c99メソッドを使用すると、テーブルにNULLポインタが生成され、問題になるとデバッグが容易になります。この方法で文字列テーブルを更新するのを忘れてしまった場合は、segfaultsをデバッグするのが難しくなります。とにかく私がオフセットを覚えなければならないなら、それはシンボルを持つ点を打ち負かします。宣言が機能していた場合
が、私はこのような望ましい効果を達成できます。少なくともgcc
で、しかし
enum {THING_FOO = 0, THING_BAR, THING_BAZ, NUM_THINGS};
void foo(void)
{
static const char *table[NUM_THINGS];
table[THING_FOO] = "foo";
table[THING_BAR] = "bar";
table[THING_BAZ] = "baz";
/* ... */
}
を、これははは、最適化されません。
このような文字列テーブルをc89で宣言する方法はありますか? (これは、アセンブリで問題ありません。)
[cで列挙型の名前を文字列に変換する方法](http://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c) – Leandros
いろいろな方法がありますが、最も醜い方法であると思う方法を選びました。多くの方法がありますが、1つは他よりも悪い方法です。 – Leandros
あなたの質問には、C99以降のエレガントなものではなく、enum値の間のギャップを埋めるものはありません。私は少し混乱している。とにかくコードを変更しなければならないのは明らかです。これは、「巨大なスイッチのステートメント」、またはこの質問の投稿、そして*まだ*どこでもコードを変更する必要がありますか? – WhozCraig