Troels Thomsen wrote:
> Hvis man skriver struct sA { ........ } saObj1, saObj2; laver man instanser
> af structet.
Ja syntax'en for struct instantiering er:
TYPE a, ...;
Hvor TYPE i overstående er en struct sA, der er erklæret på stedet.
> Men det gør typedef struct sA_tag { ........ } sA; vel ikke?
Nej syntaksen for typedef er
typedef TYPE NAME;
Der gør NAME til et andet navn for TYPE
> sA obj1 // Ok?
> struct sA_tag obj2 // Ok?
> void func(sA* asdf); // Ok?
> void func(struct sA_tag* asdf); // Ok?
OK alt sammen, men jeg ville normalt foretrække:
typdef struct A { ... } A;
Da man så kan bruge navnene "A" eller "struct A" ækvivalent. Der er ikke
nogen grund til at benytte "A_tag".
Med denne definition kan man nemt predeclare'e A, når man kun har brug
for deklarationen, men ikke definitionen, f.eks. i header-filer, hvor
man blot deklarerer (ikke definerer) funktioner der benytter A:
---- foo.h ----
typedef struct A A; // refrain from including the definition of A
void foo(A a); // declare foo that accepts A, by value!
---- foo.c ----
#include "foo.h"
#include "A.h" // Get the definition of A
void foo(A a) { ... } // define foo
>>f.eks. er
>> struct A {};
>> struct A {};
>>U gyldig kode, da det indeholder 2 "forskellige" (jf. definitionen af
>>type-ækvivalens) definitioner af struct A.
> ???
Prøv at køre det igennem compileren, den vil ikke spise det :)
>>Uhadada, #define er en farlig ting:
>
Det var nok bare et udtryk for min irritation over drilleriet.
En preprocessor er selvf. en rar ting, da C og C++ ikke har noget
meta-sprog eller reflection.
Men alt for tit har jeg haft kode i hånden der har _mærkelig_ opførsel
pga. defines, og som lige så godt kunne have brugt C's almindelige
mekanismer.
--
Helge