Wann und wo die Endung "_t"?



  • Mir ist da eines aufgefallen, ich sehe immer häufiger Typbezeichner die auf _t enden. Z.B. wchar_t, oder in der ASLsind auch vermehrt solche Typen zu sehen. Aber ich konnte kein Schema erkennen. Vielleicht nur typedef? Oder native Typen? Oder Typen die durch Operatorüberladung wie native Typen handhabar sind? Ich weiß nicht. Vielleicht weiß es hier jemand?



  • Afaik sind das vor allem Standard-Typen, die für eine bestimmte Funktion(sgruppe) vorgesehen waren z.B. time_t oder clock_t - und weil das Standard-Kommitee etwas "einfallslos" war, haben sie einfach dem Namen der Funktion ein _t angehängt (z.B. man: clock -> clock_t).



  • Daran ist das Standardkommitee nicht schuld. Das kommt aus der Unix-Welt, wo im Laufe der Jahre immer mehr Typen von short/int/long in Typedefs wie pid_t, socklen_t usw. gewandelt wurden. Einige dieser Typen, wie time_t z.B., haben es dann auch in ANSI-C geschafft.
    Ob diese Konvention heute noch gebraucht wird weiß ich nicht, ich hoffe es jedenfalls nicht 🙂



  • Ah, ok, also typedefs mit _t würde schlüssig klingen. Vorallem wenn man es durchgängig betreiben würde. Bei wchar_t und size_t hatte ich mir da noch keine Gedanken gemacht. Dann habe ich aber mal so in der ASL rumgestöbert und es sind mir _t's aufgefallen. Ohne erkennbares Muster. Beispiel:
    http://opensource.adobe.com/classadobe_1_1sequence__model__t.html

    OK, also werde ich meine ganzen typedefs in meinen Projekten nicht mehr mit _t enden lassen?



  • neu im standard sind nun auch

    int8_t
    int16_t
    int32_t
    int64_t
    uint8_t
    uint16_t
    uint32_t
    uint64_t
    

    was ich persoenlich sehr gut finde :), ich ueberlege ernsthaf von meinen sonstigen typedefs darauf umzusteigen 🙂



  • Bashar schrieb:

    Ob diese Konvention heute noch gebraucht wird weiß ich nicht, ich hoffe es jedenfalls nicht 🙂

    Dafür nutzt man jetzt _type 😉

    template<...>
    class basic_string {
    // ...
    public:
      typedef size_t size_type;
    ...
    };
    


  • ich dachte immer das '_t' steht für 'type' bzw. selbstdefinierter typ.
    ich finde so ein '_t' eigentlich ganz intuitiv...

    Bashar schrieb:

    Ob diese Konvention heute noch gebraucht wird weiß ich nicht, ich hoffe es jedenfalls nicht 🙂

    wieso findeste das doof?
    was würdest du als ersatz vorschlagen?



  • Wie waers mit einfach weglassen?



  • rapso schrieb:

    neu im standard sind nun auch

    int8_t
    int16_t
    int32_t
    int64_t
    uint8_t
    uint16_t
    uint32_t
    uint64_t
    

    was ich persoenlich sehr gut finde :), ich ueberlege ernsthaf von meinen sonstigen typedefs darauf umzusteigen 🙂

    Was heißt neu im Standart? Seit wann?
    Bei welchen Compilern funktioniert das? g++4?



  • Apollon schrieb:

    Wie waers mit einfach weglassen?

    nö, das ist schlecht.
    ich finde es ist schon eine wichtige information für leute, die ein programmm lesen, ob's ein selbstdefinierter typ ist oder nicht...



  • darthdespotism schrieb:

    rapso schrieb:

    neu im standard sind nun auch

    int8_t
    int16_t
    int32_t
    int64_t
    uint8_t
    uint16_t
    uint32_t
    uint64_t
    

    was ich persoenlich sehr gut finde :), ich ueberlege ernsthaf von meinen sonstigen typedefs darauf umzusteigen 🙂

    Was heißt neu im stan****? Seit wann?
    Bei welchen Compilern funktioniert das? g++4?

    Der Standard der noch in Arbeit ist, aber schon dieses Jahr der erste Entwurf raus kommt. Compiler gibts dafür noch nicht.



  • Weglassen ist gut wenn man Typen und Variablen z.B. durch Case unterscheidet. Wenn man aber (wie im Standard) alles klein schreibt, kann das doof werden.

    Beispiel:

    struct functor
    {
        struct context
        {
        };
    
        functor(context& context)
            : m_context(context)
        {
        }
    
        context& m_context;
    };
    

    Nicht sehr hübsch. (Weiss nichtmal ob das legal ist, ich schreib sowas nie.) In dem Fall ist es IMHO besser den Typ context einfach context_t zu nennen.



  • ten schrieb:

    Apollon schrieb:

    Wie waers mit einfach weglassen?

    nö, das ist schlecht.
    ich finde es ist schon eine wichtige information für leute, die ein programmm lesen, ob's ein selbstdefinierter typ ist oder nicht...

    Naja, nur in C++ sind ja alles selbt definierte Typen, außer die paar die wir sonst kennen. Jede Klasse in C++ ist ein selbstdefinierter Typ. Oder was verstehst du unter selbstdefinierter Typ?



  • hustbaer schrieb:

    Weglassen ist gut wenn man Typen und Variablen z.B. durch Case unterscheidet. Wenn man aber (wie im Standard) alles klein schreibt, kann das doof werden.

    Beispiel:

    struct functor
    {
        struct context
        {
        };
    
        functor(context& context)
            : m_context(context)
        {
        }
    
        context& m_context;
    };
    

    Nicht sehr hübsch. (Weiss nichtmal ob das legal ist, ich schreib sowas nie.) In dem Fall ist es IMHO besser den Typ context einfach context_t zu nennen.

    Wird nicht gehen... struct context ist definiert, das kann man nicht mehr als Variable benutzen.



  • ten schrieb:

    Apollon schrieb:

    Wie waers mit einfach weglassen?

    nö, das ist schlecht.
    ich finde es ist schon eine wichtige information für leute, die ein programmm lesen, ob's ein selbstdefinierter typ ist oder nicht...

    daran glaubst du doch nicht wirklich...?



  • also bei mir haben alle von MIR definierten Typen ein großes T vorangestellt, so kann ich sogar von MIR definierte typen von standard typen unterscheiden ..... ... ... ..... ..... ich hab mich jetzt nicht wirklich hinreissen lassen den send button zu drücken oder ?



  • darthdespotism schrieb:

    rapso schrieb:

    neu im standard sind nun auch

    int8_t
    int16_t
    int32_t
    int64_t
    uint8_t
    uint16_t
    uint32_t
    uint64_t
    

    was ich persoenlich sehr gut finde :), ich ueberlege ernsthaf von meinen sonstigen typedefs darauf umzusteigen 🙂

    Was heißt neu im stan****? Seit wann?
    Bei welchen Compilern funktioniert das? g++4?

    Das ist aus dem C99-Standard (und wir auch hoffentlich im C++09 Standard aufgenommen!)

    Boost hat dafür boost/cstdint.hpp. Ansonsten schau mal ob dein Compiler ein stdint.h hat.

    <edit>Fehler behoben: stdint anstelle stddef</edit>



  • Artchi schrieb:

    ten schrieb:

    Apollon schrieb:

    Wie waers mit einfach weglassen?

    nö, das ist schlecht.
    ich finde es ist schon eine wichtige information für leute, die ein programmm lesen, ob's ein selbstdefinierter typ ist oder nicht...

    Naja, nur in C++ sind ja alles selbt definierte Typen, außer die paar die wir sonst kennen. Jede Klasse in C++ ist ein selbstdefinierter Typ. Oder was verstehst du unter selbstdefinierter Typ?

    da hast du natürlich recht.
    ich hab's gar nicht aus der sicht eines c++ coders betrachtet.
    hinter jede klasse ein _t zu schreiben sieht natürlich auch doof aus.
    wenn ich c++'ler wäre, würde ich vielleicht nur hinter reine datenklassen das _t schreiben, und bei solchen, in denen die funktionalität steckt eben nicht...

    DEvent schrieb:

    ten schrieb:

    Apollon schrieb:

    Wie waers mit einfach weglassen?

    nö, das ist schlecht.
    ich finde es ist schon eine wichtige information für leute, die ein programmm lesen, ob's ein selbstdefinierter typ ist oder nicht...

    daran glaubst du doch nicht wirklich...?

    doch, guck' mal:

    typedef struct blah {...} blah_t;
    void f (blah_t *b);
    blah_t g(void);
    ...
    blah_t blah, anotherblah;
    f (&blah);
    anotherblah = g();
    ... // usw.
    

    sieht man doch gleich dass 'blah_t' ein typ ist.
    ich finde das _t macht den code etwas leserlicher als ohne...



  • Artchi schrieb:

    ...
    Der Standard der noch in Arbeit ist, aber schon dieses Jahr der erste Entwurf raus kommt. Compiler gibts dafür noch nicht.

    ich glaube das ist bei allen compilern mitlerweile dabei (mein cell-gcc kann das auf jeden fall, VC++ kann das glaube ich auch), man muss nur etwas dafuer includen, wenn es native unterstuetzung faende waere das super, ist ja nicht mehr lang hin, wobei boese zungen behaupten dass es sich bis C++0f hinziehen koennte mit dem C++0x-standard.

    ich denke auch ein wenig, dass es garnicht gedacht ist diese typen direkt zu benutzen, sondern als stabile basis fuer die eigenen typedefs __int64, long long... das suckt einfach.



  • @rapso:
    Ich denke er meinte den *ganzen* neuen Standard, nicht bloss die int32_t Geschichte (die MSVC im Übrigen nicht kennt).



  • Genau, meine den C++2009-Standard. Weil offiziell kennt C++ das C99 nicht. Deshalb ist es legitim das MSVC die ganzen oben genannten Typen nicht kennt, weil MSVC eher ein C++-Compiler und kein C-Compiler ist.
    GCC ist dagegen eine Compiler Collection (aha!) und hat deshalb einmal einen C++-Compiler und C-Compiler der hoffentlich C99 kennt.


Anmelden zum Antworten