Alias-Funktionen abhängig vom Datentyp

OP #4113353
Lesenswert?
• ▲
▼
Hallo zusammen,
ich habe keine sinnvollere Überschrift gefunden. Ich habe ein paar 
Funktionen implementiert, die Rücksicht auf die Integer-Breite nehmen 
müssen:
1
uint8_t complfkt_uint8(uint8_t val1,int8_t val2);
2
int8_t complfkt_int8(int8_t val1,int8_t val2);
3
uint16_t complfkt_uint16(uint16_t val1,int16_t val2);
4
int16_t complfkt_int16(uint16_t val1,int16_t val2);

Jetzt will ich diese Funktionen noch für Datentypen mit 
plattformabhängigen Bitbreiten nutzen. Folgendes geht nicht:
1
#if sizeof(uint_fast8_t) == sizeof(uint8_t)
2
    uint_fast8_t complkft_uint_fast8(uint_fast8_t val1, int_fast8_t val2) 
3
    {
4
        return complfkt_uint8(val1,val2);
5
    }
6
#elif sizeof(uint_fast8_t) == sizeof(uint16_t)
7
    uint_fast8_t complkft_uint_fast8(uint_fast8_t val1, int_fast8_t val2) 
8
    {
9
        return complfkt_uint16(val1,val2);
10
    }
11
#elif ...
12
#else
13
    #error "unexpected width of type uint_fast8_t"
14
#endif
da der sizeof-Operator nicht vom Präprozessor ausgewertet werden kann, 
beschreibt aber ganz gut mein Ziel: Ich will Operationen mit Datentypen 
mit plattformabhängiger Bitbreite auf fertige Funktionen mit fester 
Bitbreite zurückführen, um nicht alles mehrfach implementieren zu müssen 
und um ein wenig Programmspeicher zu sparen.

switch/case kann den sizeof-Operator als Label benutzen und der 
Optimierer dürfte die toten Zweige und die Abfrage mit dem immergleichen 
Ergebnis auf jeder Plattform direkt eliminieren - allerdings steht 
offiziell erst zur Laufzeit der Funktion fest, ob überhaupt ein Fall 
getroffen wird:
1
uint_fast8_t complkft_uint_fast8(uint_fast8_t val1, int_fast8_t val2) 
2
{
3
    switch(sizeof(uint_fast8_t)) {
4
        case sizeof(uint16_t) return complfkt_uint16(val1,val2);
5
        case sizeof(uint8_t)  return complfkt_uint8(val1,val2);
6
        ...
7
        default: error("function is undefined for type "uint_fast8_t")
8
    }
9
}


Kann einer der C-Gurus dazu einen Tipp geben?

Viele Grüße
W.T.
Gast #4113909
Lesenswert?
• ▲
▼
C++ geht doch gar nicht. Ist doch nur so'n OOP Voodoo. Sowas kann man 
einzig in ASM machen. Nur dann hat man die volle Kontrolle über alles.
(Gefundene Ironnie darf behalten werden!)
Mal im Ernst. Das ist genau die Arbeit, die der C++-Compiler in 
Hintergrund automatisch macht.
Wer's dennoch in C will, der kann die "if"'s einfach als C -Code 
hinschreiben. Wenn dann uint_fast8_t keine 8-Bit hat, ist dieser Zweig 
wegen "niemals auszuführen" im fertigen Programm auch nicht mehr zu 
finden. Oder man sollte seinen Compiler wechseln. Gute gibt's auch 
umsonst!
OP #4114159
Lesenswert?
• ▲
▼
Hallo zusammen,

würde ich für dieses Projekt C++ nutzen, würde ich diese Frage nicht 
stellen. Mein Projekt liegt momentan bei ca. 8kLOC und nachdem ich die 
Hardwareplattform einmal mittendrin gewechselt habe (was mich ca. 8 
Monate gekostet hat), wird die Programmiersprache innerhalb des Projekts 
erst einmal beibehalten. Es bleibt also C99 gesetzt.

ich schrieb:
> #if UINT_FAST8_MAX == UINT8_MAX

Das dürfte die Lösung sein. Danke!

Viele Grüße
W.T.
Gast #4114621
Lesenswert?
• ▲
▼
>>Mein Projekt liegt momentan bei ca. 8kLOC und nachdem ich die
>>Hardwareplattform einmal mittendrin gewechselt..

Naja, 8kloc ist nicht gerade die Welt. Und wenn man eh die 
Hardware-Plattworm gewechselt hat, dann wird der Code ja jetzt schon 
sehr portabel sein.

Was spricht dagegen, statt gcc jetzt g++ zu nehmen, und dann das Dutzend 
an Warnings zu korrigieren?

Lieber einmal ordentlich machen, als sich in C zu verrenken.

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.