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

Gast #295798
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren