Warum ist Überladen in C nicht möglich? [geschlossen]

7

Ich weiß, dass Überladen in C nicht möglich ist, und ich möchte wissen: Warum werden Überladungsfunktionen innerhalb der Klasse und außerhalb der Klasse in C ++ gleich behandelt?

Betrachten Sie diesen Fall in C ++, wo die Funktionen außerhalb der Klasse deklariert sind:

%Vor%

Wenn C ++ jeden Funktionskopf als eindeutig behandelt, warum kann nicht auch C?

Ich denke, dies könnte der Grund sein:

  • Das Überladen von Funktionen wurde in C ++ eingeführt, daher ist es in C nicht verfügbar.
  • Polymorphismus ist ein OOP-Konzept, aber C ist nicht objektorientiert.

Gibt es Gründe für die Nichtverfügbarkeit von Funktionsüberladung in C?

    
Venkatesh 14.12.2014, 12:37
quelle

3 Antworten

8

Der vielleicht wichtigste Grund ist der Mangel an Stand der Technik. Es gibt nur sehr wenige Beispiele von Features, die vom Standard-Committee zu C hinzugefügt wurden und die bisher weder populäre Erweiterungen waren, noch streng konformen Code schreiben müssen.

Es gibt einen vage definierten "Geist von C", der in der C99-Begründung (V5.10) steht (Seite 3, emph meins):

  

Einige der Facetten des Geistes von C können in Sätzen wie folgt zusammengefasst werden:

     
  • Vertraue dem Programmierer.
  •   
  • Verhindere nicht, dass der Programmierer tut, was zu tun ist.
  •   
  • Halten Sie die Sprache klein und einfach.
  •   
  • Bietet nur eine Möglichkeit, eine Operation auszuführen.
  •   
  • Machen Sie es schnell, auch wenn es nicht garantiert tragbar ist.
  •   

Außerdem versucht C, rückwärtskompatibel zu älteren Revisionen zu bleiben; Old-Style-Deklarationen zum Beispiel wurden in C89 als veraltet markiert, sind aber immer noch Teil von C11. Ebenda, Seite 2:

  

Vorhandener Code ist wichtig, vorhandene Implementierungen nicht. Es gibt eine große Menge an C-Code   von beträchtlichem kommerziellen Wert. Jeder Versuch wurde unternommen, um den Großteil davon sicherzustellen   Der Code wird für jede dem Standard entsprechende Implementierung akzeptiert. Der C89-Ausschuss   Ich wollte die meisten Programmierer nicht zwingen, ihre C-Programme zu modifizieren, nur um sie zu akzeptieren   von einem konformen Übersetzer.

Einige Unterschiede in C und C ++ werden zumindest teilweise durch Überladen von Funktionen verursacht, zum Beispiel durch die Art der Zeichenkonstanten:

%Vor%

In C ++ heißt das foo(char) , aber in C ist der Typ von 'x' int , also wäre das Ergebnis eher überraschend, oder 'x' wäre möglicherweise vom Typ char bestehenden Code brechen. Darüber hinaus möchten Sie wahrscheinlich einige Aktionen, wo sie sinnvoll sind, z. Wenn im letzten Beispiel die zweite Deklaration von foo nicht angegeben wurde, wird 'x' zu int hochgestuft und foo(int) wurde aufgerufen. Solche Regeln können im Detail komplex werden (sollte void * implizit für Funktionsaufrufe konvertiert werden?). (Keine harte Zahl, aber das Kapitel über das Überladen von Funktionen im C ++ - Standard (Kapitel 13) im n3797-Entwurf umfasst etwa 30 Seiten, Kapitel ibid. 5.2.2 über Funktionsaufrufe ist wesentlich länger als der entsprechende C-Normteil.)

So ziemlich jede Eigenschaft von C ist für eine minimale Sprache notwendig (gut, modulo historisches Vermächtnis), es gibt sehr wenig syntaktischen Zucker; Das Überladen von Funktionen könnte als solches betrachtet werden (Sie könnten Ihre Funktionen foo_int und foo_char etc benennen und das korrekte explizit aufrufen).

Die von Ihnen vorgeschlagenen Gründe sind zirkulär (und sind daher nicht anwendbar): C hat einige C ++ - Funktionen übernommen (z. B. Funktionsprototypen); und das Überladen von Funktionen wurde in C ++ eingeführt, weil es C nicht gab (man kann nicht sagen "Es ist nicht Teil von C, weil es Teil von C ++ ist und Teil von C ++, weil es nicht Teil von C ist"). Gleiches gilt für den zweiten Vorschlag zu C und OOP.

Was ich persönlich an C mag, ist, dass es ziemlich nah an der Maschine liegt. Es ist oft einfach zu sehen, wie Assembler-Ausgabe, die von C-Code generiert wird, sich darauf bezieht. Die Symbolnamen sind nicht migriert und können leicht identifiziert werden. Die Sprache ist einfach und minimal gehalten. Ehrlich gesagt verstehe ich nicht, was die Leute wollen, wenn sie bestimmte C ++ - Funktionen in C einbauen wollen: Wir haben C ++, eine Sprache, die diese Dinge anbietet, mit der Fähigkeit, plattformspezifischen, effizienten Code zu schreiben; warum nicht einfach benutzen?

C11 hat _Generic eingeführt, was für Sie von Interesse sein könnte.

    
mafso 14.12.2014, 15:46
quelle
8

Vielleicht finden Sie einen interessanten Punkt in C99 Begründung 7.22 / 25 Typ-generische Mathematik <tgmath.h> :

  

Die Fähigkeit, sowohl auf Integer als auch auf Floating-Typen zu überladen   waren für einige Funktionen nützlich, zum Beispiel copysign . Überlastung   mit einer anderen Anzahl von Argumenten hätte erlaubt, Namen wieder zu verwenden,   Zum Beispiel remainder für remquo . Diese Einrichtungen hätten jedoch   komplizierte die Spezifikation; und ihre natürliche konsistente Verwendung, wie z   wie für eine schwimmende abs oder eine zweiargument atan, hätte eingeführt   weitere Unstimmigkeiten mit C89 wegen unzureichendem Nutzen.

Auch C11 Standard eingeführt Typ _Generic Makros, die zu irgendeiner Art von Überladung erlaubt, in Beachten Sie, dass verschiedene Typen als funktionsähnliche Makroargumente behandelt werden können.

    
Grzegorz Szpetkowski 14.12.2014 12:51
quelle
3

Ich würde sagen, der erste und wichtigste Grund, warum C nicht überladen ist, ist, dass C keine Funktionsnamen enthält:

Jede Funktion in C wird in ein Symbol mit dem gleichen Namen übersetzt, während in C ++ der Name verändert wird.

Ein Beispiel:

Nimm deine Funktionen:

%Vor%

Die Symbolnamen, die durch den C ++ - Code entstellt werden, sehen folgendermaßen aus:

%Vor%

In C-Code wird dies zu:

%Vor%

Bottom line - C ++ erlaubt die Namensverfälschung, so dass der Compiler die Funktionsnamen und alle Verweise auf drei verschiedene Namen "ändert"

C erlaubt keine Namensänderung nach dem neuesten Standard (und ich bezweifle, dass sich das jemals ändern wird), also ist eine solche Lösung einfach nicht möglich.

    
Ishay Peled 14.12.2014 12:47
quelle

Tags und Links