Перечисление C / C ++ и массив char * - PullRequest
4 голосов
/ 08 февраля 2011

Бегал по следующему коду в статье и не думал, что это стандартный синтаксис C / C ++ для массива char *. В качестве теста и Visual C ++ (Visual Studio 2005), и C ++ Builder Rad XE отклоняют 2-ю строку.

Без использования #define s, у кого-нибудь есть какие-то хитрости / советы для синхронизации enum s и строкового массива, не прибегая к STL?

Еще вопрос любопытства.

enum TCOLOR { RED, GREEN, BLUE };

char *TNCOLOR[] = { [RED]="Red", [GREEN]="Green", [BLUE]="Blue" };

Кроме того, статья, из которой она вышла, довольно старая, и я считаю, что она может работать в GCC, но не тестировалась.

Ответы [ 4 ]

7 голосов
/ 08 февраля 2011

Это обозначенные C99 инициализаторы. GCC поддерживает их в режиме C90 (и в C ++) как расширение. Читайте об этом здесь:

http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

Нет хорошего способа синхронизировать перечисления и строки. Если бы мне это действительно нужно, я бы написал сценарий для получения объявлений enums из исходного кода и генерации массивов строк из этого. Я действительно ненавижу делать это с макросами.

ОБНОВЛЕНИЕ: Вот вопрос прошлого года, в котором обсуждается преобразование enum-> string (для печати в данном случае)

C ++: Вывести значение перечисления в виде текста

4 голосов
/ 08 февраля 2011
char *TNCOLOR[] = { [RED]="Red", [GREEN]="Green", [BLUE]="Blue" };

Это разрешено только в C99, не в C ++ 03, C ++ 0x или любой другой версии C.

Подробнее о Назначенные инициализаторы для типов агрегатов - C99 .

1 голос
/ 28 сентября 2011

Я понимаю, что это старый вопрос, но он может помочь любому, кто ищет простой способ синхронизации нескольких массивов / перечислений.

В моем случае я просто хотел проверить во время компиляции, чтобы определить, не синхронизированы ли мои списки, и поскольку оператор sizeof не обрабатывается до тех пор, пока после препроцессор сделает свое дело, это было Самый простой способ сделать это.

В каком-то заголовочном файле ...

enum ColorType
{
    Red=0,
    Blue,
    Green,
    ColorType_Max
};

В том же заголовке или в каком-то другом файле, возможно ...

char const* ColorTypeNames[]=
{
    "Red",
    "Blue",
    "Green"
};

В файле cpp где-то ...

const int s_ColorTypeCount = (int)ColorType_Max;
const int s_ColorNameCount = (int)(sizeof(ColorTypeNames)/sizeof(char const*));
const int s_ColorErrorA = 1/(s_ColorTypeCount/s_ColorNameCount);
const int s_ColorErrorB = 1/(s_ColorNameCount/s_ColorTypeCount);

Только при совпадении двух размеров s_ColorErrorA и s_ColorErrorB будут равны 1. Поскольку переменные являются константами, это приведет к ошибке деления времени компиляции на ноль, когда две переменные подсчета различаются.

1 голос
/ 08 февраля 2011

Это синтаксис C99, который поддерживается GCC. С вашими требованиями

  • нет # определить
  • нет STL

вы, вероятно, не найдете синхронизацию.

...