Forum: Mikrocontroller und Digitale Elektronik funktion mit vordefinierten variablen


von Jens (Gast)


Lesenswert?

Hallo,
gibt es eine möglichkeit in C eine Funktion mit deklarierten Variablen 
zu definieren? So dass ich die Funktion nicht mit allen Variablen 
aufrufen muss?

z.B.
1
uint8_t volume(x, y, z=0);

wenn ich jettz volume(1,2) aufrufen würde, dass z automatisch als 0 
angenommen wird?

Jens

von fop (Gast)


Lesenswert?

Nein. Das ist ein Feature von C#. In C++ könntest Du immerhin die 
Funktion überladen, also eine zweite Variante erstellen, die nur 2 
Parameter erwartet und sich dann so verhält, als wäre z==0.

von Jens (Gast)


Lesenswert?

fop schrieb:
> Nein. Das ist ein Feature von C#. In C++ könntest Du immerhin die
> Funktion überladen, also eine zweite Variante erstellen, die nur 2
> Parameter erwartet und sich dann so verhält, als wäre z==0.

Ich dachte in C++ wäre es auch möglich. Dann muss ich halt immer 0 
mitsenden.

Danke

von g457 (Gast)


Lesenswert?

> Das ist ein Feature von C#.

Andersrum. C++ kann 'default arguments' [0] (und formale Parameter sind 
Bestandteil der Funktionssignatur), Zeh-Häsch hat es übernommen.

In C macht man sowas mit va_arg. Aber nur wenn es unbedingt sein muss, 
nicht für Spaß.


[0] https://en.cppreference.com/w/cpp/language/default_arguments

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

fop schrieb:
> Nein. Das ist ein Feature von C#. In C++ könntest Du immerhin die
> Funktion überladen,

Das ist nicht nötig, da es in C++ exakt dieselben Defaultargumente mit 
exakt derselben Syntax gibt. Sie müssen in der Deklaration (d.h. dem 
Funktionsprototypen) und nicht der Definition (der eigentlichen 
Funktion) angegeben werden:
1
// Prototyp
2
int bla(int fusel, int laber = 0);
3
4
5
...
6
// Implementierung
7
int bla(int fusel, int laber)
8
{
9
  ... etc
10
}

In C aber gibt es das nicht.

von Carl D. (jcw2)


Lesenswert?

Jens schrieb:
> Hallo,
> gibt es eine möglichkeit in C eine Funktion mit deklarierten Variablen
> zu definieren? So dass ich die Funktion nicht mit allen Variablen
> aufrufen muss?
>
> z.B.
>
1
> uint8_t volume(x, y, z=0);
2
>
>
> wenn ich jettz volume(1,2) aufrufen würde, dass z automatisch als 0
> angenommen wird?
>
> Jens

Wobei das Ergebnis für volume(x,y); x,y:beliebig, falls der Name nicht 
in die Irre führen soll, wohl nicht mal einen Aufruf erfordert.

von S. R. (svenska)


Lesenswert?

Rufus Τ. F. schrieb:
> In C aber gibt es das nicht.

Wobei man das mit dem Präprozessor nachbauen kann. Ist halt hässlich.

von unsicher (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> // Prototyp
> int bla(int fusel, int laber = 0);

Müssen die Default-Params nicht von links und lückenlos erfolgen:

... (int foo = 123, int myfoo = 456, int blabla, int blub);

aber nicht
... (int myfoo = 456, int blabla, int blub, int foo = 123);

von mh (Gast)


Lesenswert?

unsicher schrieb:
> Rufus Τ. F. schrieb:
>> // Prototyp
>> int bla(int fusel, int laber = 0);
>
> Müssen die Default-Params nicht von links und lückenlos erfolgen:
>
> ... (int foo = 123, int myfoo = 456, int blabla, int blub);
>
> aber nicht
> ... (int myfoo = 456, int blabla, int blub, int foo = 123);

Nein! Sie müssen "von rechts lückenlos" erfolgen
> ... (int myfoo, int blabla, int blub = 456, int foo = 123);

von unsicher (Gast)


Lesenswert?

mh schrieb:
> Sie müssen "von rechts lückenlos" erfolgen

oder so, aber ich wusste, da war doch was ... ;_)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

unsicher schrieb:
> oder so, aber ich wusste, da war doch was ... ;_)

Ich hab' nicht drauf hingewiesen, aber mein hochkomplexes Beispiel 
erfüllt die Bedingung trotzdem ...

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.