С99 позволяют инициализаторы массива (среди прочих), чтобы указать, какой элемент массива создается с натуральным целеуказателем ($ 6.7.8.6, $ 6.7.8.17), например так:обозначений в c89
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, которые сложнее отлаживать. Также он побеждает точку с символами, если я все равно должен помнить о смещениях.
Если декларация была в функции, я мог бы достичь желаемого эффекта, как это:
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";
/* ... */
}
Однако, по крайней мере, с gcc
, это не получить оптимизированы.
Есть ли способ объявить такую таблицу строк в c89? (Это не проблема в сборке.)
Возможный дубликат [Как преобразовать имена переименований в строку в c] (http://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c) – Leandros
Там много способов, выбрали путь, который, по вашему мнению, является наименее уродливым. Есть много, много способов, один хуже другого. – Leandros
На ваш вопрос, ничего такого элегантного, как C99 или новее, оставит пробелы, которые вы используете между значениями перечисления. Однако я немного смущен. Поскольку вам явно нужно изменить код в любом случае, что, по вашему мнению, займет меньше времени: «огромное предложение switch» или сообщение об этом вопросе и * все еще нужно менять код везде независимо? – WhozCraig