[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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.