C90: как глобально инициализировать эту структуру в C без расширений C99

Мне было интересно, как лучше всего инициализировать эту структуру с помощью C90, сохраняя при этом ее аккуратность.

В моем заголовочном файле, назовите его test.h, у меня определена следующая структура:

 struct s_test_cfg{
      char *a[3];
      char *b[3];
      char *c[3];
 }

Затем я объявляю ее как внешнюю структуру, чтобы я мог инициализировать ее глобально в файле .c:

 extern struct s_test_cfg test_cfg;

Теперь в моем файле .c я хочу иметь возможность объявить что-то подобное глобально (очевидно, то, что я собираюсь написать, не поддерживается в C90):

 struct s_test_cfg test_cfg =
 { .a = {"a", "b", "c"},\
   .b = {"d", "e", "f"},\
   .c = {"g", "h", "i"} };

Это, очевидно, делает его очень аккуратным и прозрачным в отношении того, что вы пытаетесь сделать. Как я могу инициализировать глобальную структуру в моем файле C, которая также является чистой, как этот синтаксис? Спасибо.


person Jack    schedule 08.07.2011    source источник
comment
GCC, но мы хотим сохранить C90, поскольку все остальное в проекте написано для совместимости с C90.   -  person Jack    schedule 08.07.2011
comment
В нашем проекте мы переходим даже на gcc-only расширения (некоторые только в gcc ›= 4.5), потому что вероятность использования другого компилятора очень мала.   -  person osgx    schedule 08.07.2011
comment
Примечание: в вашей инициализации нет необходимости в символе продолжения `\` (если только он не является частью макроса, занимающего несколько строк).   -  person Michael Burr    schedule 08.07.2011


Ответы (1)


struct s_test_cfg test_cfg = {
    { "a", "b", "c" },  /* .a */
    { "d", "e", "f" },  /* .b */
    { "g", "h", "i" },  /* .c */
};

вероятно, самый чистый вариант (если не считать компилятора C99; GCC и Intel C поддерживают C99).

person Fred Foo    schedule 08.07.2011
comment
Я мог бы поклясться, что пробовал это раньше несколько раз и получал ошибки компилятора из-за фигурных скобок вокруг скалярных инициализаторов, но сейчас это работает по какой-то причине, пойди разберись. Спасибо, что подтвердили, что это сработает. - person Jack; 08.07.2011