Как инициализировать структуру структур внутри файла заголовка в C? - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь перенести старый код из 20-летней системы DOS в систему GNU Linux.В некоторых из их заголовочных файлов (которые включены повсеместно) у них есть структуры структур, которые они объявляют и инициализируют.Я получаю предупреждения при компиляции так, как был написан унаследованный код.Любые советы о том, как заставить это работать в одном и том же заголовочном файле?

Ниже приводится упрощенный пример того, что они делают.

Ответы [ 3 ]

6 голосов
/ 20 декабря 2010

Вы не должны создавать какие-либо структуры в заголовочных файлах. Если вы сделаете другой экземпляр, он будет создан в каждом C-файле, и вы включите заголовок, в котором обычно нет желаемого эффекта.

В C-файле для этого вам нужно будет сделать следующее.

void foo(){
struct A parent;
struct B child_b;
struct C child_c;

child_b.temp3 = 3;
child_b.temp4 = 4;
child_b.temp5 = 5;

child_c.temp6 = 6;
child_c.temp7 = 7;
child_c.temp8 = 8;

parent.temp1 = child_b;
parent.temp2 = child_c;
}

Я бы настоятельно рекомендовал сделать вспомогательные функции похожими на эти

void initB(struct B* s, int x, int y, int z){
    s->temp3 = x;
    s->temp4 = y;
    s->temp5 = z;
}

Если вы хотите сохранить синтаксис инициализации массива, рассмотрите возможность использования объединения.

1 голос
/ 20 декабря 2010

Объявите структуры B и C перед A, то есть:

struct B { int temp3; int temp4; int temp5; };
struct C { int temp6; int temp7; int temp8; };
struct A { struct B temp1; struct C temp2; };
0 голосов
/ 20 декабря 2010

Код, который вы опубликовали, не компилируется, поскольку использование неполного типа для объявления членов struct запрещено.Я предполагаю, что вы просто неправильно упорядочили свои определения struct: определения для B и C должны идти первыми.

Сказав, что единственное предупреждение, которое может генерировать этот код, это "предупреждение" от компоновщикачто может жаловаться на множественные определения одного и того же объекта test_one, если заголовочный файл включен в несколько единиц перевода.В Си это технически незаконно, хотя многие компиляторы допускают его как популярное расширение компилятора.

Итак, какие "предупреждения" вы получаете?

...