Betrachten Sie den folgenden "C" Code:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
wird am Ende des Quellcodes definiert und es wird keine Deklaration bereitgestellt, bevor sie in verwendet wird main()
. Genau zu dem Zeitpunkt , wenn der Compiler sieht Func_i()
in main()
, kommt es aus dem heraus main()
und findet heraus Func_i()
. Der Compiler findet irgendwie den von zurückgegebenen Wert Func_i()
und gibt ihn an printf()
. Ich weiß auch, dass der Compiler den Rückgabetyp von nicht finden kann Func_i()
. Es wird standardmäßig nimmt (Vermutungen?) , Um den Rückgabetyp von Func_i()
sein int
. Das heißt, wenn der Code float Func_i()
den folgenden Fehler hätte, würde der Compiler ihn ausgeben: Konflikttypen fürFunc_i()
.
Aus der obigen Diskussion sehen wir, dass:
Der Compiler kann den von zurückgegebenen Wert finden
Func_i()
.- Wenn der Compiler den Wert zurückgeführt, indem finden können ,
Func_i()
indem kommen aus dermain()
den Quellcode und die Suche nach unten, dann warum kann es nicht die Art von Func_i () finden, die sich explizit erwähnt.
- Wenn der Compiler den Wert zurückgeführt, indem finden können ,
Der Compiler muss wissen, dass
Func_i()
es sich um den Typ float handelt. Aus diesem Grund tritt der Fehler von Typen auf, bei denen Konflikte auftreten.
- Wenn der Compiler weiß, dass
Func_i
es sich um den Typ float handelt, warum wird dann immer noch davon ausgegangenFunc_i()
, dass es sich um den Typ int handelt, und es wird der Fehler in Konflikt stehender Typen ausgegeben? Warum macht es nicht gewaltsam,Func_i()
vom Typ float zu sein?
Ich habe den gleichen Zweifel mit der Variablendeklaration . Betrachten Sie den folgenden "C" Code:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
Der Compiler gibt den Fehler aus: 'Data_i' nicht deklariert (erstmalige Verwendung in dieser Funktion).
- Wenn der Compiler sieht
Func_i()
, geht er zum Quellcode, um den von Func_ () zurückgegebenen Wert zu finden. Warum kann der Compiler nicht dasselbe für die Variable Data_i tun?
Bearbeiten:
Ich kenne die Details der inneren Arbeitsweise von Compiler, Assembler, Prozessor usw. nicht. Die Grundidee meiner Frage ist, dass ich den Rückgabewert der Funktion nach der Verwendung endlich im Quellcode wiedergebe (schreibe) Von dieser Funktion aus kann der Computer mit der Sprache "C" diesen Wert finden, ohne dass ein Fehler auftritt. Warum kann der Computer den Typ nicht auf ähnliche Weise finden? Warum kann der Typ von Data_i nicht gefunden werden, da der Rückgabewert von Func_i () gefunden wurde? Selbst wenn ich die extern data-type identifier;
Anweisung verwende, sage ich nicht, dass der Wert von diesem Bezeichner (Funktion / Variable) zurückgegeben werden soll. Wenn der Computer diesen Wert findet, warum findet er dann den Typ nicht? Warum brauchen wir überhaupt die Forward-Deklaration?
Vielen Dank.
Func_i
ungültig gemacht. Es gab nie eine Regel, um undefinierte Variablen implizit zu deklarieren, daher war das zweite Fragment immer fehlerhaft. (Ja, Compiler akzeptieren das erste Beispiel immer noch, da es unter C89 / C90 gültig war, wenn es schlampig war.)