2014-06-17 3 views
0

Это моя структура:Как инициализировать массив структуры, который имеет указатель на массив структуры?

struct ini_entry { 
    const char *section; 
    const char *name; 
}; 

struct ini_parser { 
    bool (*parser) (void *ctx, const char *file, struct collection_item **vals, int nval); 
    struct ini_entry *entries; 
}; 

Это мой инициализатор:

static struct ini_parser parsers[] = { 
    {NULL, &(struct ini_entry) {"test", "xxx"}} 
}; 

Мне нужно добавить еще ini_entry в инициализаторе. Есть ли способ сделать это со статической инициализацией внутри одной декларации?

Извините за мой английский.

ответ

0

Во-первых, struct ini_entry *entries; должен быть struct ini_entry const *entries;, если вы намерены инициализировать его строковым литералом (и даже если вы этого не сделаете).

Но этот вид макета может быть легче читать:

struct ini_entry const foo_entries[] = { 
    { "test", "xxx" }, 
    { "flub", "yyy" }, 
    { "gnas", "zzz" }, 
    { NULL, NULL }  // list terminator presumably required 
}; 

struct ini_parser const parsers[] = { 
    { "foo", foo_entries }, 
    { "bar", bar_entries } 
}; 

Обратите внимание, что можно было бы использовать подсчитываются список вместо того, чтобы использовать торцевой часовой; длина списка - это константа времени компиляции (sizeof foo_entries/sizeof foo_entries[0]), которую вы можете поместить в качестве третьего члена struct ini_parser.

+0

Спасибо за помощь. Но мне нужна отдельная декларация без специального 'ini_entry'. Что-то вроде '{NULL, & (struct ini_entry) {{" test "," xxx "}, {" test2 "," yyy "}}}'. – UltimaWeapon

+0

Почему вы «нуждаетесь» в этом? –

+0

Я думаю, что он прост в использовании, чем создать новый выделенный массив 'ini_entry'. Он также удаляет переменную, которая используется только для инициализации структуры. – UltimaWeapon

Смежные вопросы