Forum: Compiler & IDEs Funktionsüberladung in C


von Gregor B. (gregor54321)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

Nein.

von daniel (Gast)


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

von daniel (Gast)


Lesenswert?

Korrektur: Linker kann nicht anderen Code dazulinken,

von Johann L. (gjlayde) Benutzerseite


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:
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

von Μαtthias W. (matthias) Benutzerseite


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

von Johann L. (gjlayde) Benutzerseite


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.

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.