32 bit und 64 bit Kompatibles Datenformat <--> static_assert für size_t



  • Hallo,

    um binär gespeicherte Daten zwischen 32 bit und 64 bit Programmen kompatibel zu halten, soll verboten werden unmittelbar ein size_t zu speichern, denn unter Windows hat size_t in den verschiedenen Programmen eine unterschiedliche Größe.

    Da wir zum speichern eine Template Funktion benutzen, kam die Idee auf, über ein static_assert und std::is_same ein Compile Zeit-Fehler zu produzieren wenn das Template Argument ein size_t ist. Allerdings prüft der Compiler den type nicht gegen size_t sondern gegen den Basistype des typedefs vom size_t.

    Kann man den Compiler (VC++ 10) irgendwie dazu überreden anders zu prüfen?
    Oder hat jemand eine andere Idee?

    Gruß + Dank



  • um binär gespeicherte Daten zwischen 32 bit und 64 bit Programmen kompatibel zu halten, soll verboten werden unmittelbar ein size_t zu speichern, denn unter Windows hat size_t in den verschiedenen Programmen eine unterschiedliche Größe.

    Wenn Bitzahl wichtig ist, dann lege sie einfach fest und benutze an entsprechenden Stellen uint32_t oder uint64_t bzw. die signed Varianten.

    Kann man den Compiler (VC++ 10) irgendwie dazu überreden anders zu prüfen?

    Ein sizeof kann in einem (static_)assert zur Kompilezeit benutzt benutzt werden. Von der Templategeschichte halte ich nix, da parameterisiert wird, um dann doch nicht zu parameterisieren.


  • Mod

    Da ein typedef keinen eigenen Typ darstellt, ist das nicht möglich.

    Wenn man Aufwand betreiben will könnte man es automatisisert evtl. so handhaben:
    Man modifiziert das Template so, dass bei Verwendung des durch size_t bezeichneten Typen eine Warnung ausgegeben wird. Dann vergleiche man die Ausgabe der Compilierung für beide Targets. Jede Warnung, die in beiden Fällen an der gleichen Stelle auftritt, ist dann mit hoher Warscheinlichkeit ein gesuchter Fehler (size_t oder Verwandte wie uintptr_t o.ä.)


Log in to reply