mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.