Überlagerung von Funktionsnamen in C (nicht C++)

Gast #295798
Hallo,

in C++ kann man die Funktionsnamen überlagern, indem man mehrere
Funktionen gleichen Namens, aber mit unterschiedlicher Parameterliste
anlegt.

Das ist im normalen C ja eigentlich nicht möglich.
Eigentlich...

Wie ist das mit Makros in C? Wie werden diese vom Compiler
unterschieden? Nur anhand des Namens oder zusätzlich auch anhand der
Parameterliste?

Dann könnte man das Problem mit Makros lösen.

Gruß Michael
Gast #295800
Hi Chris,

anhand des Smilies am Ende deiner Nachricht gehe ich davon aus, dass
der letzte Satz nicht böse gemeint ist. Genauso wie diese beiden.
grins

Du hast zwar recht, aber erstens schreib ich gerade nicht von meinem
eigenen Rechner, und zweitens solltest du bedenken, dass vielleicht
irgendjemand mal die gleiche Frage haben könnte. Wenn er dann noch
fähig ist, die Forumssuche zu verwenden, dann ist dem Betreffenden
schon geholfen...

Und vielleicht weiss ja jemand was zu dem Thema, was wir BEIDE nicht
wissen...

Gruß Michael
Persönliche Seite #295801
C kennt keine Überladung von Funktionen, eine Mehrfachdefinition des
gleichen Funktionsnamens mit unterschiedlichen Argumenten wird daher
als Fehler betrachtet.

Obendrein erzeugt ein C-Compiler auf Objektebene keine Informationen
über einer Funktion übergebene Parameter; die dem Linker übergebenen
Symbole entsprechen dem Funktionsnamen mit vorangestelltem Unterstrich.

Auch aufgrund dieser Tatsache kann eine Überladung von Funktionen nicht
erfolgen, da sonst der Linker mehrere identische Symbole vorgesetzt
bekäme.

Für C++ wurden für genau diesen Zweck die "dekorierten" Symbole
eingeführt, die in codierter Form Informationen über die Argumente
enthalten, so daß zwei Funktionen gleichen Namens mit unterschiedlichen
Argumenten aus Sicht des Linkers unterschiedliche Namen haben.

So kann auch für C++ der gleiche Linker verwendet werden, wie für C.

Der Präprozessor ist hierbei auch keine Hilfe, denn der macht nur
simplen Textersatz, mehr nicht.

In einer "translation unit" gilt ein mit #define definiertes Macro
genau so lange, bis ein anderes mit dem gleichen Namen angelegt wird.
Argumente werden dabei gar nicht unterschieden.

Also:

  #define bla(a) {a=0;}

wird von

  #define bla "fusel"

überschrieben.
Gast #295802
@Rufus:

Danke für die Informationen. Das gibt auch mal einen guten Einblick,
wie die ganzen Sachen (Compiler, Linker, usw.) funktionieren...

Danke

Ralf

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.