AVR-GCC: __int24

#3586761
Lesenswert?

Hallo zusammen,
der AVR-GCC verfügt ja über einen Datentyp __int24, den ich auf dem AVR 
gerne so nutze:
1
typedef __int24int_least24_t;
(auf dem ARM ist er dann als als int32 definiert).

Gibt es eine Möglichkeit einen PRIxLEAST24 (sozusagen wie PRIxLEAST16) 
zu definieren, um diesen Datentyp direkt mit printf ausgeben zu können?

Viele Grüße
W.T.
Moderator Persönliche Seite #3587786
Lesenswert?

Johann L. schrieb:
> Nein. Die Libc wurd enicht erweitert.

Könnte man allerdings tun, müsste mal jemand einen Bugreport einkippen.

> Nimm einfach den nächst größeren
> Typ, alse 32 Bit.

Wie sieht das mit der integer promotion hier aus?  Das Argument ist
ja in einer variadischen Liste.  Wird es da zu unsigned long promotet,
oder landet es wirklich nur mit 3 Bytes auf dem Stack?  In letzterem
Falle müsste ja auch vfprintf() selbst erweitert werden.
Moderator Persönliche Seite #3587825
Lesenswert?

A. K. schrieb:
> Wobei printf dann noch grösser wird als bisher.

Nur für den Fall, dass sie tatsächlich mit 3 Byte auf dem Stack landen,
aber dann wäre es auch tödlich, den Fall nicht zu behandeln (weil sich
alle nachfolgenden Argumente verschieben).

Für den Fall, dass er sowieso auf 32 bits promotet wird, wäre
PRIxLEAST24 nur ein (weiterer) Alias für "lx" im Headerfile.
Persönliche Seite #3587865
Lesenswert?

Das avr-Backend definiert momentan keine Promotion-Regeln, d.h. 3-Byte 
Typen werden als solche übergeben.  Variadische Funktionen müssen also 
genau 3 Bytes abholen; ansonsten darf man mit Problemen rechnen.

Für Standard-Funktionen wie prinf find ich es ausreichend, Warnungen zu 
beachten wie sie mit -Wformat (ist Teil von -Wall) ausgegeben werden.

Dies bedeutet dann, die 3-Byte Typen per Cast als 4-Byte Typ zu 
übergeben und Modifier wie %ld zu verwenden. Die Extension und den einen 
PUSH mehr kann man gut verschmerzen bei dem Wust, den die stdio 
Funktionen ohnehin bedingen.

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