Fehlende Prototypdeklaration
-
Hallo,
bei der Kompilierung eines älteren Programms tritt die Warnung (warning: cast to pointer from integer of different size) auf.
Hier Exemplarisch der Code:
void test() { (char *)foo(); }
Die Kompilierung mit den gcc 4.3.4 (gcc -c test.c) führt zu der besagten Warnung. Wird das gleiche Programm mit dem gcc 3.3.3 kompiliert werden keine Warnungen ausgegeben.
Füge ich eine Vorwärtsdeklaration hinzu, tritt die Warnung beim gcc 4.3.4 ebenfalls nicht ein.
char *foo(); void test() { (char *)foo(); }
Meine Fragen:
Erlaubt es C, dass eine Funktion verwendet werden kann ohne sie vorher zu deklarieren? Was ist der technische Hintergrund? Gibt es Quellen zum nachlesen?
Nimmt der Compiler in diesem Fall die Signatur
int foo()
an, so dass es zu der Warnung kommt?
Warum geht es in der alten gcc Version?
Kann ich den gcc per Flags überreden oder sollte ich eine Prototypdeklaration vornehemen?
Danke
René
-
Erlaubt es C, dass eine Funktion verwendet werden kann ohne sie vorher zu deklarieren? Was ist der technische Hintergrund? Gibt es Quellen zum nachlesen?
Ja, per default ist alles int. Das steht im Standard und hat irgendwelche historischen Gründe die gewiss mal ganz sinnvoll waren. Heutzutage ist das aber allen peinlich und man verschweigt lieber, dass das geht. Der default int hat seinen Platz eigentlich nur noch in Codeobfuskationswettbewerben.
-
Erfolgt ein Funktionsaufruf ohne vorige Deklaration, nimmt der Compiler eine implizite Deklaration in der Form:
extern int funktion();
an. (return-Typ int + feste, aber unbekannte Argumentenliste). Das ist ANSI C Standard.