UNIXwork

C: optionale Parameter / benannte Parameter

03. Oktober 2022

Im Gegensatz zu C++ oder vielen anderen Sprachen unterstützt C keine Default Values für Funktionsparameter. Auch ein Sprachkonstrukt wie Named Parameters, welches es z.B. in Python gibt, kennt C nicht.

Häufig wird als Workaround dafür Variadic Parameters verwendet, z.B. laut Linux-Manpage gibt es den open-Syscall in zwei Varianten:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

In Wahrheit sieht die Signatur allerdings so aus:

int open(const char *pathname, int flags, ...);

Das funktioniert grundsätzlich, hat jedoch den Nachteil, dass für alle zusätzlichen optionalen Parameter keine Typüberprüfung stattfindet.

Es gibt jedoch eine Alternative die sich Compound Literale für structs bemächtigt. Die Idee ist, dass alle Parameter an die Funktion per struct übergeben werden. Damit es wie ein normaler Funktionsaufruf aussieht, wird das ganze als Makro hübsch verpackt, welches die Makro-Parameter zu einem Compound Literal macht.

#include <stdio.h>

typedef struct {
	int a;
	int b;
	int c;
} TestFuncArgs;

#define testfunc(...) testfunc_f((TestFuncArgs){ __VA_ARGS__})

void testfunc_f(TestFuncArgs args) {
	printf("a: %d   b: %d   c: %d\n", args.a, args.b, args.c);
}

int main(int argc, char** argv) {
	testfunc(1, 2, 3);
	testfunc(4, 5);
	testfunc(.a = 10, .c = 20);

	//testfunc("hello"); //warning

	return 0;
}

Hier findet für alle Parameter eine Typüberprüfung statt und zusätzlich gibt es auch die Option, Designated Initializers zu verwenden, daher anstatt die struct-Werte als einfache Liste in richtiger Reihenfolge anzugeben, kann auch einfach der Feldname angegeben werden.

Autor: Olaf | 0 Kommentare | Tags: c

Kommentare


Name
Webseite (optional)
Captcha: 3x=12   x=?
Kommentar