Forum: Compiler & IDEs [C]: Funktionsparameter(union) direkt casten


von Ralf (Gast)


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

von Peter II (Gast)


Lesenswert?

ob die variabel da steht oder nicht, sollte keine auswirkung auf die 
Codegröße haben. Für soetwas ist der optimier da, schreib es lesbar ohne 
cast und gut ist.

von xfr (Gast)


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]

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Paßt ja auch hinten und vorne nicht. Es _Piept mit 24 Bit und
gecastet wird über irgendwas mit 16 Bit. Paßt eher überhaupt nicht.
Das sollte auch ohne -pedantic eine Fehlermeldung geben.

von Andreas B. (andreasb)


Lesenswert?

Joachim Drechsel schrieb:
> Paßt ja auch hinten und vorne nicht. Es _Piept mit 24 Bit und

Warum 24 bit?

Ich sehe auch 16 bit...

Casten finde ich aber auch unschön...


Edit: Habe gerade den GCC befragt, der meint auch es sind 2 Bytes = 16 
bit.



mfg Andreas

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Sorry, sind 32 ... ;) (sizeof( _Piep))

von Sven P. (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Ist in
> ISO-C99 spezifiziert.

Ich glaube, in der anonymen Form wie hier spezifiziert C99 das nicht,
aber der GCC erlaubt es als Spracherweiterung.  Ist eben nur nicht
portabel (im Gegensatz zu der Variante mit der Hilfsvariablen).

von Yalu X. (yalu) (Moderator)


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.

von Ralf (Gast)


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

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.