Code Styleguide



  • Erhard schrieb:

    Wir könnten den Styleguide zunächst in deutsch entwickeln und verabschieden, dann würde ich ihn anschließend ins Englische übersetzen, um Hürden für vorwiegend englisch-sprachige Mitglieder möglichst niedrig zu halten

    Dafür biete ich mich an. Du müsstest dann nur die Korrektur besorgen.


  • Mod

    Dafür biete ich mich an.

    ... für das ins Englische übersetzen?



  • +gjm+ schrieb:

    Wie würdest Du das genau machen?

    Wenn PrettyOS einen Systemtimer hat, dann ist er in der "systemtimer.c" definiert und das "Präfix" "systemtimer_" darf außerhalb der systemtimer.c nicht für Bezeichner verwendet werden.

    Aber woran unterscheide ich namespace-Präfixe wie in systemtimer_time von ganz normalen Worttrennern wie in beep_time? Nur daran, daß es die Datei systemtimer.c gibt? Das könnte unerwünschten Effekten führen, daß man bei einer neuen Systemdatei beep.h viele Umbenennungen machen muß oder gar der Systemdatei nur den zweitbesten Namen gibt, um nicht viel bestehenden Code ändern zu müssen.


  • Mod

    Hier ein erster Vorschlag für die zu verwendenden Typen für einfache Variablen mit Bitte um Ergänzung (stdint.h sollten wir nicht verwenden, damit wir völlig unabhängig bleiben):

    typedef unsigned int    size_t;
    typedef unsigned int    uint32_t;
    typedef unsigned long   uint32_t;
    typedef unsigned short  uint16_t;
    typedef unsigned char   uint8_t;
    typedef signed   int    int32_t;
    typedef signed   long   int32_t;
    typedef signed   short  int16_t;
    typedef signed   char   int8_t;
    

    Das _t sollten wir wohl anhängen, um C99-konform zu bleiben.
    http://www.oreillynet.com/pub/a/network/2003/10/07/michael_barr.html



  • Erhard Henkes schrieb:

    typedef unsigned int    uint32_t;
    typedef unsigned long   uint32_t;
    

    Ist der uint32_t unsigned int oder unsigned long?
    Ansonsten ist die Liste vollständig, bis Bedarf für uint64_t da ist. ptrdiff_t und sowas verwendet eh keiner.



  • volkard schrieb:

    Aber woran unterscheide ich namespace-Präfixe wie in systemtimer_time von ganz normalen Worttrennern wie in beep_time?
    Nur daran, daß es die Datei systemtimer.c gibt?

    So ist es. Unerwünschte Effekte können dann nur noch das Resultat von reinen Designfragen sein.


  • Mod

    bis Bedarf für uint64_t da ist

    Ist in einem Neuentwurf schon vorhanden. Wie macht man das sauber?
    unsigned longlong?



  • Erhard Henkes schrieb:

    bis Bedarf für uint64_t da ist

    Ist in einem Neuentwurf schon vorhanden. Wie macht man das sauber?
    unsigned long long?

    klar. und feige sein und mit irgend einem STATIC_ASSERT-Makro die Eigenschaft sizeof(uint64_t)==8 absichern. falls je mal eine maschine/compiler auftaucht, wo long long nicht 64 bit hat, kann man dann das passende #ifdef rausfinden.



  • Erhard Henkes schrieb:

    Dafür biete ich mich an.

    ... für das ins Englische übersetzen?

    Ja, das hatte ich gemeint. Aber wahrscheinlich ist es doch besser, das Ding so knapp zu halten, dass es sich nicht lohnt, die Arbeit für die Übersetzung zu delegieren.

    Übrigens wird auch im ANSI-Forum darüber gesprochen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-252394.html


  • Mod

    Übergangsweise habe ich Folgendes in die os.h implementiert, damit beide Versionen noch laufen. Später fliegen die alten Types komplett raus. Ihr könnt also für neuen Code schon die neuen verwenden.

    /// //////////////////////////////////////
    /// ////  TODO: ANSI TYPEDEFINITIONS  ////
    /// //////////////////////////////////////
    
    // old
    
    #define TRUE   1
    #define FALSE  0
    
    typedef unsigned int   UINT;
    typedef unsigned short USHORT;
    typedef unsigned long  ULONG;
    /// //////////////////////////////////////
    
    // new
    
    typedef unsigned int         size_t;
    
    typedef unsigned long long   uint64_t;
    typedef unsigned long        uint32_t;
    typedef unsigned short       uint16_t;
    typedef unsigned char        uint8_t;
    
    typedef signed long long     int64_t;
    typedef signed long          int32_t;
    typedef signed short         int16_t;
    typedef signed char          int8_t;
    
    /// //////////////////////////////////////
    

    Version http://www.henkessoft.de/OS_Dev/Downloads/109.zip (Oct 24, 2009)
    beinhaltet bereits die umgestellten typedefs.


  • Mod

    Wie machen wir das mit TRUE und FALSE? Das habe ich noch nicht ganz verstanden. Nehmen wir da "0" (FALSE) und "ungleich 0" (TRUE) anstelle FALSE und TRUE?

    so sieht's bei windef.h aus:

    #ifndef FALSE
    #define FALSE 0
    #endif
    #ifndef TRUE
    #define TRUE 1
    #endif
    


  • `typedef enum {false, true} bool;

    ...

    bool b = true;

    `



  • general bacardi schrieb:

    `typedef enum {false, true} bool;

    ...

    bool b = true;

    `

    👍


  • Mod

    Ja, dann werden wir das implementieren und TRUE und FALSE gegen true und false austauschen. Macht auch Sinn in Richtung C++. C99 hat noch kein bool und true und false?



  • Wozu überhaupt ein boolean, es gibt 0 und ungleich 0 und so schreibt man es am Besten explizit hin... 😕



  • Erhard Henkes schrieb:

    C99 hat noch kein bool und true und false?

    Doch: http://en.wikipedia.org/wiki/Stdbool.h 🕶

    abc.w schrieb:

    Wozu überhaupt ein boolean, es gibt 0 und ungleich 0 und so schreibt man es am Besten explizit hin...

    Die Intention wird dadurch deutlich, dass es sich um Wahrheitswerte handelt.



  • general bacardi schrieb:

    abc.w schrieb:

    Wozu überhaupt ein boolean, es gibt 0 und ungleich 0 und so schreibt man es am Besten explizit hin...

    Die Intention wird dadurch deutlich, dass es sich um Wahrheitswerte handelt.

    Informatikermärchen 😉


  • Mod

    Also, wenn ich in ckernel.c

    while(TRUE){/*  */}
    

    gegen

    while(true){/*  */}
    

    austausche, erhalte ich folgende Fehlermeldung:

    ckernel.c:332: error: 'true' undeclared

    Füge ich

    typedef enum {false, true} bool;
    

    in os.h ein, so läuft das brav durch. Damit können wir "true" und "false" (analog C99 bzw. C++) verwenden. Das ist modern. Daher plädiere ich dafür. Jeder weiß, dass false 0 und true 1 bedeutet.

    Bezüglich: "ungleich 0"
    Wo finde ich dies in einer Definition? TRUE oder true ist doch in der Regel gleich "1" definiert?

    while(1){/*  */}
    

    wirkt halt irgendwie seltsam. 😃



  • Erhard Henkes schrieb:

    Wo finde ich dies in einer Definition? TRUE oder true ist doch in der Regel gleich "1" definiert?

    Ich meine mich zu erinnern, daß true als !false definiert ist. Ob das true==1 wird, ist egal.



  • Erhard Henkes schrieb:

    Bezüglich: "ungleich 0"
    Wo finde ich dies in einer Definition?

    Das steht sicherlich im C-Standard

    if (a)  /* Wenn a ungleich 0 wird verzweigt */
    {
      ...
    }
    

    TRUE oder true ist doch in der Regel gleich "1" definiert?

    Nein, true ist das Gegenteil von false. Es gibt nur die beiden. 1 ist eine Zahl und Zahlen gibt es sehr viele. 🤡


Anmelden zum Antworten