Funktionsüberladung in C

OP #1078028
Hallo!
Ich versuchte eine überladene Funktion zu schreiben:
1
void SPI_write(uint8_t reg);
2
void SPI_write(uint8_t reg, uint16_t data);
3

4

5
void SPI_write (uint8_t reg) {
6
  SPDR = reg;
7
  while (!(SPSR & (1<<SPIF)));
8
}
9

10
void SPI_write (uint8_t reg, uint16_t data) {
11
  SPDR = reg;
12
  while (!(SPSR & (1<<SPIF)));
13
  SPDR = data>>8;
14
  while (!(SPSR & (1<<SPIF)));
15
  SPDR = data;
16
  while (!(SPSR & (1<<SPIF)));
17
}

Aber der Compiler meckert, das die Funktion schon deklariert ist. Geht 
das überhaupt?
Grüße, Gregor
Gast #1078069
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
Persönliche Seite #1078175
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:
1
// Modul 1
2
extern int foo();
3

4
int __attribute__((weak)) foo()
5
{
6
    return 0;
7
}
1
// Modul 2
2
extern int foo();
3

4
#ifdef FOO
5
int foo()
6
{
7
    return 1;
8
}
9
#endif // FOO
10

11
int main()
12
{
13
    return foo();
14
}

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
Persönliche Seite #1079170
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

Eine eigene Frage? Dieser Thread ist über 17 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.