Pointer auf struct - ohne forward declaration (wieso gehts manchmal?)
Verfasst: 25.04.2024, 16:22
Schönen Nachmittag liebe zfx Gemeinde :-)
Ich kann mir nicht helfen, doch würde ich euch gerne aktuell an einer kleinen Verwirrung meinerseits teilhaben lassen. (:
Wieso benötigt der Compiler (gcc, als auch clang) bei Pointer auf struct manchmal eine forward declaration - und manchmal nicht?
Zwei Beispiele:
Gegeben sei eine Funktion mit entsprechendem Prototyp (der ja typischerweise später dann im .h file schlummert):
Folgendes lässt sich ohne Warnung compilieren (abgesehen von [-Wunused-parameter]).
Dies jedoch nicht!
Bei letzterem ist eine forward declaration notwendig:
Natürlich mach ich gerne eine forward declaration. Nur frag ich mich, wieso es nicht mehr funktioniert, wenn der Rückgabetyp der Funktion nicht vom entsprechenden (struct pointer) Typ ist.
Ich kann mir nicht helfen, doch würde ich euch gerne aktuell an einer kleinen Verwirrung meinerseits teilhaben lassen. (:
Wieso benötigt der Compiler (gcc, als auch clang) bei Pointer auf struct manchmal eine forward declaration - und manchmal nicht?
Zwei Beispiele:
Gegeben sei eine Funktion mit entsprechendem Prototyp (der ja typischerweise später dann im .h file schlummert):
Folgendes lässt sich ohne Warnung compilieren (abgesehen von [-Wunused-parameter]).
Code: Alles auswählen
struct s * func(struct s *);
struct s * func(struct s * p){ return (struct s *)0; }
Dies jedoch nicht!
Code: Alles auswählen
void func(struct s *);
void func(struct s * p){ return; }
Code: Alles auswählen
foo.c:2:18: warning: declaration of 'struct s' will not be visible outside of this function [-Wvisibility]
void func(struct s *);
^
foo.c:3:18: warning: declaration of 'struct s' will not be visible outside of this function [-Wvisibility]
void func(struct s * p){ return; }
^
foo.c:3:6: error: conflicting types for 'func'
void func(struct s * p){ return; }
^
foo.c:2:6: note: previous declaration is here
void func(struct s *);
^
2 warnings and 1 error generated.
Code: Alles auswählen
struct s;
void func(struct s *);
void func(struct s * p){ return; }