size_t oder std::size_t?



  • geht es auch ohne std:: vorne dran? die boost autoren schreiben es immer mit und deshalb frage ich mich gerade, ob das auch ohhne legal ist.



  • Hem, gute Frage. Es gibt definitiv ein std::size_t, welches ein typedef in der Standardlib ist. Alles was in der Standardlib ist, ist auch im Namespace std. Das betrifft auch size_t. std::size_t habe ich auch immer benutzt.

    Es gibt in C auch ein size_t, welche in den C-Headern definiert ist. Halt ohne Namespace... klar, ist ja C. Kenne mich aber in C überhaupt nicht aus.

    Ich glaube, es ist eigentlich egal. Ich pers. nehme aber als C++ler weiterhin std::size_t, sonst muß man einen C-Header inkludieren, was ich vermeide, wenn es C++ Alternativen gibt.



  • Hmmm...
    std::size_t wäre wohl die bessere Wahl, obwohl ich sogut wie immer bloss size_t schreibe.

    Spricht eigentlich was dagegen sich size_t, ptrdiff_t etc. mit "using std::size_t" etc. in den global namespace zu holen?


  • Mod

    hustbaer schrieb:

    Hmmm...
    std::size_t wäre wohl die bessere Wahl, obwohl ich sogut wie immer bloss size_t schreibe.

    Hier jedesmal das std:: mitzuschreiben erscheint mir persönlich als überflüssiger syntaktischer Lärm, das ist sicher nicht der Zweck der Einführung von Namespaces gewesen. iirc schreibt der Standard nicht vor, dass size_t im globalen Namensraum definiert ist, wenn das aber der Fall ist, so muß es sich so verhalten, als ob es durch using std::size_t entstanden ist (ein using namespace std darf nicht zu Konflikten führen). Es ist also nicht zulässig, in deinem Programm eine andere Definition (im globalen Namensraum versteht sich) zu verwenden.

    Spricht eigentlich was dagegen sich size_t, ptrdiff_t etc. mit "using std::size_t" etc. in den global namespace zu holen?

    Nein. Es erhöht möglicherweise sogar die Protabilität.



  • frager schrieb:

    geht es auch ohne std:: vorne dran? die boost autoren schreiben es immer mit und deshalb frage ich mich gerade, ob das auch ohhne legal ist.

    size_t liegt im Namespace std. Wenn du also size_t nicht irgend wie (mag es durch using std::size_t; oder using namespace std; sein), bleibt dir nichts anderes übrig als std::size_t zu schreiben...

    Sollte dein Compiler auch size_t akzeptieren, obwohl du es nicht in den explizit globalen namespace geholt hast, handelt es sich um einen Compiler-Bug.



  • Naja, als Compiler-Bug würde ich es nicht unbedingt bezeichnen. Immerhin ist es gültig, weiterhin in C++ die alten C Header zu verwenden. Und dann liegt size_t auch im globalen Namensraum. Allerdings sind die alten Header insofern "deprecated", dass sie in zukünftigen Standards nicht mehr unterstützt werden könnten. Bei den neuen und zu bevorzugenden Headern <c...> hast du allerdings Recht. Da sind, bis auf Makros, alle Bezeichner nur im std Namensraum verfügbar. Leider scheinen das einige Implementationen der stdlib immer noch nicht zu kapieren.



  • Ich verwende es immer ohne und es funktioniert, tief in meinem Inneren weiß ich zwar, dass ich eigentlich nen Header inkludieren müsste, aber beim VC hat man den wohl irgendwie indirekt bei den ganzen Standard-Headern dabei und warum ich das std:: nicht brauche...keine Ahnung. Im Zweifelsfall könnte man ja auch mal schnell nen suchen&ersetzen über alle Dateien eines Projektes laufen lassen. Also so schlimm find ich das jetzt nicht, wenn ich ein Projekt mal auf einem anderen Compiler übersetzen müsste.



  • Hem, also mir ist das nicht egal. Nur wie gesagt, ich habe gedacht, ::size_t ist eine legaler C-typedef. Ist es das jetzt nicht? Dann würde ich es schon wichtig finden, std::size_t zu nutzen.



  • Artchi schrieb:

    Nur wie gesagt, ich habe gedacht, ::size_t ist eine legaler C-typedef. Ist es das jetzt nicht?

    Sofern du <stddef.h> einbindest, ist es legal. Bei <cstddef> jedoch nicht, was ja empfohlen wird. Soweit ich den Standard da noch richtig in Erinnerung habe.



  • Nur als Info: MSVC frisst "size_t" sogar ohne irgendeine Header, also gleich wie "int" halt.

    @camper: OK, cool, danke, genau das wollte ich wissen 🙂


Anmelden zum Antworten