[C]: Funktionsparameter(union) direkt casten

Gast #2903515
Lesenswert?

Hallo,

gibt es in C eine Möglichkeit, einen als Union definierten 
Funktionsparameter beim Funktionsaufruf auf einen Member der Union zu 
casten?
Hier ein Beispiel:
1
//Definition Union
2
typedef union {
3
  uint8_t bla[2];
4
  uint16_t blubb;
5
} _Piep;
6

7
//aufzurufende Funktion
8
void func(_Piep param) {
9
  ...
10
}
11

12
//aufrufende Funktion
13
void func_call(void) {
14
  func((???) 0x1234);  //kann man hier direkt casten?
15
}

Das hier funktioniert logischerweise, ...
1
//aufrufende Funktion
2
void func_call(void) {
3
  _Piep param;
4
  param.blubb = 0x1234;
5
  func(param);  //okay
6
}
... da ja in der aufrufenden Funktion eine entsprechende Variable 
angelegt ist. Im Prinzip geht's nur um die Frage, ob es möglich ist, 
dass man sich in der aufrufenden Funktion die zusätzliche Variable 
spart.
In C++ würde man es ja mit der Funktionsüberladung hinbekommen und 
bräuchte dann gar keinen cast.

Ralf
Gast #2903530
Lesenswert?

1
//aufrufende Funktion
2
void func_call(void) {
3
  func((_Piep) (uint16_t) 0x1234);  //kann man hier direkt casten?
4
}

Das kompiliert bei mir, gibt aber eine Warnung:
1
ISO C forbids casts to union type [-pedantic]
Gast #2903561
Lesenswert?

Ralf schrieb:
> gibt es in C eine Möglichkeit, einen als Union definierten
> Funktionsparameter beim Funktionsaufruf auf einen Member der Union zu
> casten?
Dazu braucht man keinen Cast.

> Hier ein Beispiel:
>
1
> //Definition Union
2
> typedef union {
3
>   uint8_t bla[2];
4
>   uint16_t blubb;
5
> } _Piep;
6
> 
7
> //aufzurufende Funktion
8
> void func(_Piep param) {
9
>   ...
10
> }
11
>

Aufruf wird dann so:
1
void func_call(void) {
2
  func( (_Piep) { .blubb = 0x1234 } );
3
}

Das ist kein Cast, sondern einfach nur ein Initialisierer. Kannst du für 
Variablen genauso verwenden und funktioniert mit struct genauso. Ist in 
ISO-C99 spezifiziert.
Moderator #2904331
Lesenswert?

Jörg Wunsch schrieb:
> Ich glaube, in der anonymen Form wie hier spezifiziert C99 das nicht,

Doch, die Dinger heißen dort "compound literals" und sind im Abschnitt
6.5.2.5 beschrieben. Das ist eine der in meinen Augen wichtigsten Errun-
genschaften de C99-Standards.

> aber der GCC erlaubt es als Spracherweiterung.

Da sieht man mal, welchen Einfluss Open-Source-Software auf internatio-
nale Standards hat.
Gast #2905534
Lesenswert?

Hallo,

vielen Dank für eure Antworten. Ich werde es gleich morgen mal 
probieren.
Und ich werde mir die "compound literals" mal durchlesen, offenbar habe 
ich mit den falschen Stichwörtern gesucht.

Ralf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren