Frage

Anscheinend (zumindest nach gcc -std=c99) C99 nicht Funktion Überlastung unterstützen. Der Grund für die nicht eine neue Funktion in C unterstützt, ist in der Regel die Abwärtskompatibilität, aber in diesem Fall kann ich nicht denken Sie an einen einzigen Fall, bei dem Funktion Überlastung Rückwärtskompatibilität brechen. Was ist die Begründung nicht diesen Grundzug einschließlich?

War es hilfreich?

Lösung

Um zu verstehen, warum Sie nicht wahrscheinlich sind zu sehen in C Überlastung, könnte es helfen, besser lernen, wie man eine Überlastung von C ++ behandelt wird.

Nach dem Kompilieren von Code, aber bevor es betriebsbereit ist, die Zwischen Objektcode muß verknüpft werden. Dies verwandelt eine grobe Datenbank von kompilierten Funktionen und anderen Objekten in ein bereit zu laden / run Binärdatei. Dieser zusätzliche Schritt ist wichtig, weil es das Prinzip Mechanismus der Modularität zur Verfügung zu kompilierten Programme ist. Dieser Schritt ermöglicht es Ihnen, Code aus dem vorhandenen Bibliotheken zu nehmen und es mit Ihrer eigenen Anwendungslogik mischten.

In diesem Stadium der Objektcode in jeder Sprache geschrieben wurde, kann mit einem beliebigen Kombination von Merkmalen. Um dies möglich zu machen, ist es notwendig, eine Art Konvention zu haben, so dass der Linker der Lage ist, das richtige Objekt zu wählen, wenn ein anderes Objekt auf sie Bezug nimmt. Wenn Sie in Assembler sind Codierung, wenn Sie ein Etikett definieren, wird das Etikett genau verwendet wird, da angenommen wird, Sie wissen, was Sie tun.

In C-Funktionen werden die Symbolnamen für den Linker, so dass, wenn Sie schreiben

int main(int argc, char **argv) { return 1; }

bietet der Compiler ein Archiv von Objektcode, die ein Objekt namens main enthält.

Das funktioniert gut, aber es bedeutet, dass Sie nicht zwei Objekte mit dem gleichen Namen haben können, weil die Linke nicht in der Lage sein würde, zu entscheiden, welche Namen sollte es verwenden. Der Linker weiß nichts über Argumenttypen, und sehr wenig über Code im Allgemeinen.

C ++ löst dieses Problem durch die Codierung zusätzliche Informationen in die Symbolnamen direkt. Der Rückgabetyp und die Anzahl und die Art der Argumente zu den Symbolnamen hinzugefügt werden, und werden an der Stelle eines Funktionsaufrufes auf diese Art und Weise bezeichnet. Der Linker muss nicht wissen, dass dies auch geschieht, denn soweit es der Funktionsaufruf eindeutig sagen kann, ist.

Die Kehrseite der Medaille ist, dass die Symbolnamen sehen nicht so etwas wie die ursprünglichen Funktionsnamen. Insbesondere ist es fast unmöglich, vorherzusagen, was der Name einer überladenen Funktion so sein wird, dass Sie es verknüpfen. So verknüpfen Sie den Code foriegn, können Sie extern "C", die diese Funktionen bewirkt, dass die C-Stil Symbolnamen folgen, aber natürlich können Sie nicht überlasten, eine solche Funktion.

Diese Unterschiede zu den Design-Ziele jeder Sprache zusammen. C ist auf Portabilität und Interoperabilität ausgerichtet. C geht aus dem Weg, vorhersehbar und kompatibel Dinge zu tun. C ++ ist stärker orientiert sich die Erstellung von Rich und leistungsfähige Systeme und nicht sehr konzentriert auf mit anderen Sprachen interagieren.

Ich denke, es ist unwahrscheinlich, dass für C jemals eine Funktion zu verfolgen, der Code erzeugen würde, die so schwierig ist, mit wie C ++ zu interagieren.

Bearbeiten : Imagist fragt:

  

Wäre es wirklich weniger tragbar oder   schwieriger mit einem zu interagieren   Funktion, wenn Sie int main (int aufgelöst   argc, char ** argv) so etwas wie   main-int-int-char ** statt zur Haupt   (Und das war Teil des Standard)?   Ich sehe nicht ein Problem hier. Eigentlich,   es scheint mir, dass dies gibt Ihnen   Weitere Informationen (die verwendet werden könnten   zur Optimierung und dergleichen)

Um dies zu beantworten, ich kehre zu C ++ und die Art und Weise es mit Überlastungen beschäftigt. C ++ verwendet diesen Mechanismus, fast genau wie beschrieben, aber mit einer Einschränkung. C ++ nicht standardisieren, wie bestimmte Teile selbst umgesetzt werden sollten, und dann geht auf einen Vorschlag, wie einige der Folgen dieser Unterlassung. Insbesondere hat C ++ ein reiches Typ-System, die virtuelle Klassenelement enthält. Wie diese Funktion implementiert werden sollte bleibt den Compiler Schriftsteller, und die Details der VTable Auflösung hat eine starke Wirkung auf die Funktion Signaturen. Aus diesem Grunde C ++ schlägt vor, absichtlich Compiler Schriftsteller Namen Mangeln gegenseitig unvereinbar über com machenPilers oder gleiche Compiler mit verschiedenen Implementierungen dieser wichtigsten Features.

Das

ist nur ein Symptom für die tiefere Frage, dass, während höhere Programmiersprachen wie C ++ und C detaillierte Typ-Systeme haben, der untere Ebene Maschinencode völlig typenlos ist. willkürlich reicher Typ Systeme sind auf der Oberseite der nicht typisieren binäre auf der Maschinenebene vorgesehen gebaut. Linkers hat keinen Zugang zu den reichen Typinformationen zur Verfügung, die höheren Sprachen. Der Linker ist völlig abhängig von dem Compiler alle der Art Abstraktionen zu handhaben und produzieren richtig gibt freien Objektcode.

C ++ tut dies, indem alle erforderlichen Typinformationen in den verstümmelten Objektnamen kodiert. C hat jedoch einen deutlich anderen Schwerpunkte, mit dem Ziel eine Art tragbarer Assemblersprache zu sein. C zieht somit eine strenge 12.59 Entsprechung zwischen dem deklarierten Namen zu haben und den Symbolnamen resultierenden Objekte. Wenn C ist es Namen verstümmelt, auch in einem einheitlichen und vorhersagbaren Weise würden Sie große Anstrengungen gehen, um die geänderten Namen zu den gewünschten Symbolnamen übereinstimmen, sonst würden Sie es drehen müssen, um aus, wie Sie in c tun ++. Dieser zusätzliche Aufwand kommt bei fast keinen Nutzen, weil im Gegensatz zu C ++, C des Typs System recht klein und einfach ist.

Zur gleichen Zeit, es ist praktisch eine gängige Praxis mehrere ähnlich benannten C-Funktionen zu definieren, die nur ändern sich je nach der Art sie als Argumente. für längeres Beispiel nur dies, hat einen Blick auf dem OpenGL-Namespace.

Andere Tipps

Wenn Sie eine C-Quelle kompilieren, werden Symbolnamen bleiben erhalten. Wenn Sie Funktion Überlastung einführen, sollten Sie einen Namen Technik Mangeln bieten zu Namenskollisionen zu vermeiden. Folglich wie C ++, werden Sie Maschine erzeugte Symbolnamen in der kompilierten binären haben.

Auch C verfügt nicht über strikte Typisierung. Viele Dinge sind miteinander in C implizit konvertierbar Die Komplexität der Überladungsauflösung Regeln könnten Verwirrung in einer solchen Art von Sprache einzuführen.

Viele Sprachdesigner, mich eingeschlossen, glauben, dass die Kombination von Funktion mit C impliziten Aktionen Überlastung im Code zur Folge haben kann, dass heinously schwer zu verstehen ist. Für Beweis, Blick auf dem Körper des Wissens über C ++ angesammelt.

Im Allgemeinen wurde C99 soll eine bescheidene Überarbeitung weitgehend kompatibel mit bestehenden Praktiken sein. Overloading gewesen wäre, eine ziemlich große Abweichung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top