PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : struct in C app (mit GCC kompiliert)


Gast
2007-05-17, 15:54:25
Hallo,

habe folgenden Code:

#include <stdio.h>
#include <stdlib.h>

struct Tiff_Header //8 bytes
{
char ByteOrder[2]; //2 byte
char TiffId[2]; //2 byte
int OffsetFirstIFD; //4 byte
};

int main(int argc, const char * argv[])
{
Tiff_Header test;

return 0;
}


Meines erachtens ist dies korrekt (ausser das tst nicht verwendet wird)
Beim kompilieren mit gcc erhalte ich folgenden Fehler

main.c:13: error: 'Tiff_Header' undeclared (first use in this function)
main.c:13: error: parse error before 'test'

Warum, ich bin der Meinung das mein Code korrekt ist, offensichtlich aber doch nicht

Besserwissend
2007-05-17, 15:59:10
probier mal
struct Tiff_Header test;
statt
Tiff_Header test;
in der main

alternativ:

typedef struct
{
char ByteOrder[2]; //2 byte
char TiffId[2]; //2 byte
int OffsetFirstIFD; //4 byte
} Tiff_Header;
als selbstdefinierten Datentyp

Matrix316
2007-05-17, 16:07:39
Muss beim zweiten nicht noch "typedef" vor den Struct? :|

Besserwissend
2007-05-17, 16:13:43
Ja! (schon geändert)

Expandable
2007-05-18, 00:15:47
Wenn Du das mit einem reinen C-Compiler kompilierst, musst Du in der Tat "struct Tiff_Header test;" statt "Tiff_Header test;" schreiben. Erst bei C++ kannst Du das "struct" davor weglassen.

Das ist auch so, wenn Du structs als Funktionsparameter übergibst (oder auch enums oder unions): In C: myfunc(struct Tiff_Header blubb), in C++: myfunc(Tiff_Header blubb);

sth
2007-05-18, 04:50:12
Jo, entweder "struct Tiff_Header test;" benutzen oder aber das Struct als Typ definieren mittels typedef am Anfang der 3. Zeile. Letzteres mochte allerdings z.B. der alte MSVC-Compiler nicht. Weiß nicht, ob sich das mittlerweile geändert hat, da es soweit ich weiß eigentlich nicht standardkonform ist (wenn auch vielerorts gängige Praxis).

Besserwissend
2007-05-18, 11:11:25
Jo, entweder "struct Tiff_Header test;" benutzen oder aber das Struct als Typ definieren mittels typedef am Anfang der 3. Zeile. Letzteres mochte allerdings z.B. der alte MSVC-Compiler nicht. Weiß nicht, ob sich das mittlerweile geändert hat, da es soweit ich weiß eigentlich nicht standardkonform ist (wenn auch vielerorts gängige Praxis).

Also im ANSI ISO 9899-1990 und ANSI ISO IEC 9899 1999 stehen sogar Beispiele drin; entspricht also dem Standard. Wie es in K&R-C ist weis ich nicht.
Mit den C-Compilern ist das allerdings so eine Sache: Da kann es schon vorkommen, daß so etwas wie Du beschrieben hast auftritt.
Insbesondere der 1999er Standard wird von den Compilern stiefmütterlich unterstützt oder hat jemand schon einmal _Bool, _Complex oder _Imaginary benutzt?
Der 1990er Standard ist in den allermeisten Fällen, besonders mit den GNU Compilern, kein Problem.