www.mikrocontroller.net

Forum: Compiler & IDEs Funktionsüberladung in C


Autor: Gregor B. (gregor54321)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich versuchte eine überladene Funktion zu schreiben:
void SPI_write(uint8_t reg);
void SPI_write(uint8_t reg, uint16_t data);


void SPI_write (uint8_t reg) {
  SPDR = reg;
  while (!(SPSR & (1<<SPIF)));
}

void SPI_write (uint8_t reg, uint16_t data) {
  SPDR = reg;
  while (!(SPSR & (1<<SPIF)));
  SPDR = data>>8;
  while (!(SPSR & (1<<SPIF)));
  SPDR = data;
  while (!(SPSR & (1<<SPIF)));
}

Aber der Compiler meckert, das die Funktion schon deklariert ist. Geht 
das überhaupt?
Grüße, Gregor

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C kennt keine Überladung
=> Vorteil: ABI ist einfach

C++ kennt Überladung, manipuliert aber an dem Namen der Funktion
oder anders gesagt, die Information wird im abgeänderten Namen
festgehalten

void add(int,int) => add_ii
void add(double,double) => add_dd

je nach ABI, variirt die Abänderung => Linker kann anderen
Code dazulinken, weil der Name sich geändert hat.

http://en.wikipedia.org/wiki/Name_mangling

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur: Linker kann nicht anderen Code dazulinken,

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gregor B. wrote:

> Aber der Compiler meckert, das die Funktion schon deklariert ist. Geht
> das überhaupt?

Ja es geht.

Falls deine Toolchain waek-Symbole unterstützt:
// Modul 1
extern int foo();

int __attribute__((weak)) foo()
{
    return 0;
}
// Modul 2
extern int foo();

#ifdef FOO
int foo()
{
    return 1;
}
#endif // FOO

int main()
{
    return foo();
}

Je nachdem, ob FOO defined ist (auf Kommandozeine einmal mit -DFOO 
übersetzen, einmal ohne) wird 0 oder 1 zurückgeliefert.

Mit diesem kann man eine weak Standard-Implementierung einer Funktion 
zur Verfügung stellen, welche die Applikation überschreiben kann.

Was du suchst ist aber wohl varargs, d.h. eine Funktion soll variable 
Parameteranzahl verdauen können?

http://en.wikipedia.org/wiki/Stdarg.h

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

nein, er sucht eine Möglichkeit zwei Funktionen mit gleichem Namen und 
unterschiedlicher Parameterliste zu definieren die auch beide 
gleichzeitig verfügbar sind. Und das geht in C nicht.

Matthias

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias Weißer wrote:
> Hi
>
> nein, er sucht eine Möglichkeit zwei Funktionen mit gleichem Namen und
> unterschiedlicher Parameterliste zu definieren die auch beide
> gleichzeitig verfügbar sind. Und das geht in C nicht.

Das was am ehesten daran kommt ist eben varargs. Es wird eine Funktion 
definiert, der man aber sagen muss, wie die Argumente zu interpretieren 
sind.

Geläufigstes Beispiel für sowas ist printf. Der Formatstring gibt an, 
wie die (beliebig vielen) nachfolgenden Werte zu interpretieren sind.

Mangling/Demangling gibt's in C natürlich nicht.

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.