Die kurze Antwort ist, dass Rechenleistung und Ressourcen zwischen der Zeit, die C definiert wurde, und der Zeit, die Java 25 Jahre später kam, exponentiell fortgeschritten waren.
Die längere Antwort ...
Die maximale Größe einer Kompilierungseinheit - der Codeblock, der ein Compiler Prozesse in einem einzigen Brocken - durch die Größe des Speichers begrenzt wird, dass der kompilierende Computer hat. Um die Symbole zu verarbeiten, die Sie in Maschinencode eingeben, muss der Compiler alle Symbole in einer Nachschlagetabelle enthalten und auf sie verweisen, wenn sie in Ihrem Code darauf stoßen.
Als C im Jahr 1972 erstellt wurde, waren die Rechenressourcen viel knapper und mit einer hohen Prämie - der Speicher, der erforderlich war, um die gesamte symbolische Tabelle eines komplexen Programms gleichzeitig zu speichern, war in den meisten Systemen einfach nicht verfügbar. Festspeicher war auch teuer und extrem langsam, so dass Ideen wie virtueller Speicher oder das Speichern von Teilen der symbolischen Tabelle auf der Platte einfach keine Kompilierung in einem vernünftigen Zeitrahmen erlaubt hätten.
Die beste Lösung für das Problem war, den Code in kleinere Stücke zu zerstückeln, indem man eine menschliche Sortierung herausstellte, welche Teile der Symboltabelle in welchen Kompilierungseinheiten im Voraus benötigt würden.Eine ziemlich kleine Aufgabe auf dem Programmierer auferlegt, zu erklären, was er verwenden würde, speicherte die enorme Bemühung, den Computer zu haben, das gesamte Programm nach allem zu suchen, das der Programmierer verwenden könnte.
Es speicherte auch den Compiler von zwei Durchgänge auf jeder Quelldatei zu machen: der erste, um alle Symbole im Index zu indizieren, und der zweite, um die Referenzen zu analysieren und nachzuschlagen. Wenn Sie mit Magnetband arbeiten, bei dem die Suchzeiten in Sekunden gemessen wurden und der Lesedurchsatz in Byte pro Sekunde (nicht Kilobyte oder Megabyte) gemessen wurde, war das ziemlich aussagekräftig.
C++, obwohl fast 17 Jahre später erstellt, wurde als eine Obermenge von C definiert und musste daher den gleichen Mechanismus verwenden.
Zu der Zeit, Java im Jahr 1995 herumgerollt, hatten durchschnittliche Computer genug Speicher, dass das Halten einer symbolischen Tabelle, auch für ein komplexes Projekt, nicht mehr eine erhebliche Belastung war. Und Java war nicht so konzipiert, dass es abwärtskompatibel zu C ist, sodass es keinen Legacy-Mechanismus brauchte. C# war ähnlich unbelastet.
Als Konsequenz entschieden sich die Entwickler dafür, die Lasten der symbolischen Deklaration von dem Programmierer zu entfernen und sie wieder auf den Computer zu stellen, da ihre Kosten im Verhältnis zum Gesamtaufwand der Kompilierung minimal waren.
Die C++ Compiler sequenziell gelesen wird [das heißt, es wird von oben nach unten gelesen. ...] Genau so funktioniert die Sprache: Ihr Vorschlag, zweimal durchzugehen und die Funktionsprototypen zu betrachten, würde funktionieren, aber leider funktioniert die Sprache nicht so. – Warty
Duplizieren: http://stackoverflow.com/questions/752793 –
C wurde vor mehr als 30 Jahren standardisiert, als die zugrundeliegende Technologie weit weniger leistungsfähig und viel teurer war als heute .. Ein sanfter Vorschlag: Versuchen Sie ein wenig über die Geschichte der Dinge zu lernen und zu verstehen dass sich die Welt seitdem enorm verändert hat Die Entscheidungen wurden getroffen und werden sich auch weiterhin ändern, wenn Sie bei Ihren Entwicklungsbemühungen Entscheidungen treffen. Irgendjemand wird sich eines Tages wundern "WTF ?!" über deine Entscheidungen .... ;-) – DaveE