Forum: PC-Programmierung Überlagerung von Funktionsnamen in C (nicht C++)


von Michael (Gast)


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

von Christoph _. (chris)


Lesenswert?

Makros werden soweit ich weiß nur anhand des Namens unterschieden.
Anstelle so einen langen Beitrag zu schreiben hättest du es aber auch
einfach schnell selbst ausprobieren können. ;-)

von Michael (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Ralf (Gast)


Lesenswert?

@Rufus:

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

Danke

Ralf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.