Forum: Compiler & IDEs Alias-Funktionen abhängig vom Datentyp


von Walter T. (nicolas)


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.

von Klaus W. (mfgkw)


Lesenswert?

nimm C++, das kostet auch nicht mehr.

von Peter (Gast)


Lesenswert?

Jep, genau dafür gibt es Templates in C++.

von ich (Gast)


Lesenswert?

1
#if UINT_FAST8_MAX == UINT8_MAX

von Bastler (Gast)


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!

von Klaus W. (mfgkw)


Lesenswert?

Bastler schrieb:
> 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.

Moby?  :-)

von Bastler (Gast)


Lesenswert?

Bingo!

von Daniel A. (daniel-a)


Lesenswert?

Du suchst c11 generic selection:
http://www.robertgamble.net/2012/01/c11-generic-selections.html

Oder darf es nicht c11 sein?

von Walter T. (nicolas)


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.

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Walter Tarpan schrieb:
> C++

C11 != C++

von Walter T. (nicolas)


Lesenswert?

Michael Reinelt schrieb:
> C11 != C++

C99 != C11 != C++

Der GCC 4.7.4 unterstützt C11 nur experimentell - und mittendrin den 
Compiler wechseln habe ich auch nicht vor. Vor allem nicht für den 
Zweck, ein paar Zeilen Quelltext zu sparen.

: Bearbeitet durch User
von PittyJ (Gast)


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.

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.