2012-04-07 5 views
3

Mögliche Duplizieren:
In C++ how is function overloading typically implemented?wie eine überladene Funktion während der Kompilierung Prozess in c intern ++ repräsentiert

i auf OOPS durch Bruce Eckel Buch gehen wurde, die über die Arbeit über die überladenen Funktionen angegeben wenn sie unterschiedliche Rückgabewerte und Argumente haben.


int fun() :: could be represented as __int__fun 
float fun():: could be represented as __float__fun 
int fun(int a):: as _int _fun_int 

aber wie sieht die Überlastung im Falle von Blöcken in c arbeitet

   { 
        void fun(){} 
        ........... 
        .. 
        fun() 
       } 
       /......sme code/ 
       { 
        void fun(){} 
       } 

kann mir jemand erklären, wie funktioniert das intern dargestellt wird?

Antwort

1

In C, zwei Funktionen mit dem gleichen Namen in verschiedenen Blöcken sind wie so genannt:

functionName.number

Zum Beispiel könnten Sie haben:

fun.2051

und

fun.2053

Ich dachte, dies aus, indem ein C-Programm mit dem folgenden Befehl kompiliert:

gcc -S -o test.asm test.c

ich dann die Assembly-Datei geöffnet und beobachtet, was gcc mit Funktionen versehen.

4

Das Definieren von Funktionen innerhalb von Blöcken ist in C++ nicht zulässig.

Wenn wir uns vorstellen für eine kurze Sekunde solche Dinge sind legal, sind Ihre beiden Funktionen noch nicht überlastet. Sie haben einfach Bereiche, die sich nicht überschneiden. Ihr Beispiel unterscheidet sich nicht von dieser:

{ 
    int i; 
    ... 
    } 
    { 
    int i; 
    ... 
    } 

Es gibt keine „überlastet Variable“ hier, und keine überladene Funktion in Ihrem Beispiel.

+0

eigentlich war das ein Tippfehler. Ich fragte im Falle von c as c erlaubt es. Wie werden sie in c implementiert? Was passiert, wenn der Compiler solche Definitionen sieht? Wie werden sie gelöst? – aquasan

+0

C erlaubt jedoch keine Überlastung. Scheiß Frage meiner Meinung nach. –

0

Ein Block kann nur innerhalb einer Funktion vorkommen. C++ unterstützt/erlaubt keine verschachtelten Funktionen (d. H. Eine Funktion, die in einer anderen Funktion definiert ist), so dass die Frage niemals auftaucht.

Wenn es erlaubt war (z. B. von einem Compiler wie gcc als Erweiterung), würden Sie immer noch nicht überladen. Überladen erfordert, dass zwei (oder mehr) Entitäten mit demselben Basisnamen im selben Bereich sichtbar sind. In diesem Fall befindet sich jeder Name in einem separaten Bereich. In diesem Fall tritt kein Überladen auf. Sie verfügen lediglich über eine Suche im normalen Bereich, bei der der Name aus dem übereinstimmendsten lokalen Bereich gefunden wird.

Edit: Nebenbei, ich sollte auch hinzufügen, dass im Gegensatz zu dem, was Sie gezeigt haben, der Rückgabetyp einer Funktion ist wahrscheinlich nicht in der Mangled/verzierten Namen enthalten - Funktion Überladung hängt von der Funktion ab " Signatur ", die die Parametertypen enthält, aber nicht der Rückgabetyp.

+0

Namensräume. Außerdem können Sie [geschachtelte Funktion verwenden, indem Sie sie in lokale Klassen einfügen] (http://pastebin.com/uewsG2mx). – SigTerm

+0

@SigTerm: Trotz der oberflächlichen Ähnlichkeit in der Syntax definieren die geschweiften Klammern in einem Namespace keinen "Block", zumindest so, wie der Begriff normalerweise verwendet wird (d. H. Was C oder C++ eine "zusammengesetzte Anweisung" nennen würde). Sie können lokale Klassen definieren, aber wie in meiner Antwort erwähnt, führt das immer noch nicht zu einer Überlastung. –

0

wie eine überladene Funktion intern während der Kompilierung Prozess in c dargestellt wird ++

Google "C++ name mangling". Es wird ähnlich wie diese [email protected]@@[email protected]@@Z

mit einem Namen wie eine normale Funktion dargestellt werden, aber wie funktioniert die Überlastung arbeitet bei Blöcken

Ihr Codebeispiel nicht gültig C++ Code enthält, und wird nicht kompilieren.

Verwandte Themen