статический массив, из которого элементы (структуры) знают, где они находятся в массиве - PullRequest
1 голос
/ 23 февраля 2012

У меня есть статический массив struct MyStruct.Мне нужно получить доступ к массиву по индексу, но мне также нужно, чтобы каждый MyStruct знал, каков его индекс.В настоящее время я использую следующий код:

enum { INDEX_FOO=0, INDEX_BAR, INDEX_BAZ };
struct MyStruct{ int index; const char* name; /* other data */ };
struct MyStruct values[]={
  { INDEX_FOO, "foo" /* ... */ },
  { INDEX_BAR, "bar" /* ... */ },
  { INDEX_BAZ, "baz" /* ... */ },
};
// requirement: for all i in {0,1,2}: values[i].index==i

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

1 Ответ

3 голосов
/ 23 февраля 2012

Вы можете рассмотреть X-макросы для этого.

Что-то вроде:

blah.x

X(FOO, "foo")
X(BAR, "bar")
X(BAZ, "baz")

main.c

#define X(a,b) INDEX_#a,
enum {
#include "blah.x"
};
#undef X

#define X(a,b) { INDEX_#a, b },
struct MyStruct values[]={
#include "blah.x"
};
#undef X
...