Unterschied size_t zu UINT? Compilewarnung!



  • Hallole.

    Ich habe in meinem Programm öfters eine Vermischung von size_t und UINT.
    Der Compiler spuckt die Warnung

    warning C4267: '=': Konvertierung von 'size_t' nach 'UINT', Datenverlust möglich

    aus.

    Wenn ich mir aber in der windef.h die definition von UINT angucke, sehe ich folgendes:

    typedef unsigned int        UINT;
    

    Schaue ich mir die Definition von size_t an, dann sehe ich

    typedef unsigned int size_t;
    

    Nur ich kann nicht herausfinden wo size_t definiert ist.

    Also ist UINT und size_t dasselbe, nämlich ein unsigned int.

    Warum spuckt mir der Compiler dann die Warnung aus?
    Kannich das getrost ignorieren?
    Kann ich das casten?

    Danke mal Mondmann



  • size_t ist im ANSI-Standard festgelegt - und muß groß genug sein, um jede theoretisch mögliche Größenangabe zu schlucken. Das könnte also auch ein 'unsigned long' sein (oder ein eigener Datentyp außerhalb der int-Familie). UINT ist nur eine MS-Abkürzung für 'unsigned int'.

    (PS: Wie kannst du dir die Definition von size_t ansehen, wenn du nicht weißt, wo sie steht?)



  • Meines Wissen ist die Warnung korrekt. Ein UINT ist wie der Name schon sagt immer ein unsigned int. Allerdings ist size_t die größte verfügbare Größe im System und könnte auf anderen Systemen eben ungleich unsigned int sind.



  • Wo ist denn size_t definiert????

    Ich sehe das (VC++), wenn ich mir der Maus über den Datentyp gehe, kommt der kleine gelbe Popup.

    Rechte Maustaste-> gehe zu Definition-> kommt Meldung:"...nicht definiert..."

    Ist denn size_t IMMER ein unsigned? oder kann es auch ein signed sein?

    ZB Liefert ja strlen ein size_t zurück.

    habe ich eine Funktion zb:

    MeineFunktion(int len);(...)

    und übergebe dieser:
    MeineFunktion(strlen(variable));

    KOmmt diese Fehlermeldung...
    Was TUN???



  • nun,größen können nicht negativ sein,von daher müsste das immer unsigned sein



  • Mondmann schrieb:

    Wo ist denn size_t definiert????

    In etwa einem halben Dutzend Standard-Headern 😉

    Ich sehe das (VC++), wenn ich mir der Maus über den Datentyp gehe, kommt der kleine gelbe Popup.

    Rechte Maustaste-> gehe zu Definition-> kommt Meldung:"...nicht definiert..."

    Und woher hast du dann die obige Definition ausgegraben?

    Ist denn size_t IMMER ein unsigned? oder kann es auch ein signed sein?

    Ja, es ist vorzeichenlos. (btw, der dazugehörige vorzeichenbehaftete Typ nennt sich 'ptrdiff_t')



  • Ich sage ja: Wenn ich mit der Maus drüberfahre, kommt das Popup wo
    "typedef unsigned int size_t drinsteht..."
    Daher habe ich das...



  • Mondmann schrieb:

    Wo ist denn size_t definiert????

    In <cstddef>. (§18.1-2)

    Um zu testen, was es nun genau ist, kannst du mit Templates spielen:

    #include <iostream>
    #include <cstddef>
    
    using namespace std;
    
    template <typename T>
    void test();
    
    template <>
    void test<unsigned>()
    {
      cout << "unsigned" << endl;
    }
    
    template <>
    void test<unsigned long>()
    {
      cout << "unsigned long" << endl;
    }
    
    int main()
    {
      test<size_t>();
    }
    


  • 7H3 N4C3R schrieb:

    Mondmann schrieb:

    Wo ist denn size_t definiert????

    In <cstddef>. (§18.1-2)

    Um zu testen, was es nun genau ist, kannst du mit Templates spielen:

    #include <iostream>
    #include <cstddef>
    
    using namespace std;
    
    template <typename T>
    void test();
    
    template <>
    void test<unsigned>()
    {
      cout << "unsigned" << endl;
    }
    
    template <>
    void test<unsigned long>()
    {
      cout << "unsigned long" << endl;
    }
    
    int main()
    {
      test<size_t>();
    }
    

    Was soll das Beispiel? Zwischen "unsigned" und "unsigned long" gibts da einen
    Unterschied(ausser unterschiedliche Schreibweise) ? 😞



  • egon2 schrieb:

    Was soll das Beispiel? Zwischen "unsigned" und "unsigned long" gibts da einen
    Unterschied(ausser unterschiedliche Schreibweise) ? 😞

    Es sind unterschiedliche Datentypen. Das ist der Unterschied. unsigned long ist mindestens so breit wie unsigned (int), kann aber auch breiter sein. Selbst bei selber Größe sind es immernoch unterschiedliche Datentypen.



  • @N4C3R: Ich hoffe, dir ist klar, daß dein Testprogramm auch zu einem Linker-Fehler führen könnte 😉 Es ist nirgends vorgeschrieben, daß size_t ein simpler typedef für einen der üblichen unsigned-Typen sein muß, also kann sich dahinter auch etwas vollkommen autonomes verbergen.



  • $17.4.4.7, Fußnote 174 sagt es explizit, dass es ein Basic Integral Type sein muss. Ansonsten, da size_t aus einem C-Header kommt und im Kompatiblitätsabschnitt keine Abweichung bezüglich size_t beschrieben wird, folgt daraus implizit, dass size_t ein integraler Typ sein muss.


Anmelden zum Antworten