Jak inicializovat aa struct z structs uvnitř hlavičkový soubor v C?

hlasů
2

Snažím se portu některé staré kód přes od 20 let starého systému DOS do systému GNU Linux. V několika svých hlavičkových souborů (které jsou zahrnuty všude), oni mají structs z structs které deklarují a inicializovat. Jsem dostat upozornění, když jsem kompilaci s tím, jak starší kód byl napsán. Nějaké tipy na to, jak mohu dostat, aby to fungovalo s pobytem v rámci stejného souboru záhlaví?

Dále je uveden zjednodušený příklad jsem udělal to, co dělají.

struct A
{

    struct B  temp1;
    struct C  temp2;
};

struct B
{

    int temp3;
    int temp4; 
    int temp5;
};

struct C
{

    int temp6;
    int temp7;
    int temp8;
};


//These are the variables in how they are related to the initialization below

//struct A test_one = {{temp3,temp4,temp5},{temp6,temp7,temp8}};

struct A test_one = {{1,2,3},{4,5,6}};
Položena 20/12/2010 v 16:16
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
6

Neměli byste konkretizovat jakékoliv struktury v hlavičkových souborech. Pokud tak učiníte jiná instance bude vytvořena v každém souboru C zahrnout záhlaví, ve kterém obvykle není žádoucí účinek.

V souboru C, jak to udělat, budete muset provést následující kroky.

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;
}

Já bych silně uvažovat o podání pomocné funkce podobná této

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

Pokud byste chtěli zachovat syntaxi pole inicializační pak zvažte použití unii.

Odpovězeno 20/12/2010 v 16:20
zdroj uživatelem

hlasů
1

Určit, struct B a C, než A, tj:

struct B { int temp3; int temp4; int temp5; };
struct C { int temp6; int temp7; int temp8; };
struct A { struct B temp1; struct C temp2; };
Odpovězeno 20/12/2010 v 16:20
zdroj uživatelem

hlasů
0

Kód jste zaslali není zkompilovat, protože je zakázáno používat nekompletní typ deklarovat structčlenů. Předpokládám, že jste prostě misarranged své structdefinice: definice pro Ba Cměli jít jako první.

Který uvedl, že jediný varovný tento kód lze generovat je „varování“ ze spojkou, která by mohla stěžují více definicích stejného objektu test_one, pokud je soubor záhlaví je zahrnuta v několika překladatelských odděleních. V jazyce C je to technicky nezákonné, ačkoli mnoho kompilátorů dovolit to jako populární rozšíření kompilátoru.

Takže, co „varování“ se vám daří?

Odpovězeno 20/12/2010 v 16:22
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more