C und eigene Bezeichner



  • Hallo
    ich musste jetzt leider etwas in C programmieren, dabei habe ich echt ein Problem: Gibts es wirklich kein namespace in C?
    Wie macht ihr den das? Denkt ihr euch wirklich zu jeder Funktion einen Prefix aus?

    Ich habe grade eine kleines Programm gebastelt, das Rauschdaten vom COM-Interface auslesen kann. Dabei habe ich Funktionen wie openConnection() und closeConnection(), ebenso habe ich etliche enums definiert. Das ist ja alles im globalen Namensraum??

    Vor allem die enums. Ein paar enums sind:

    typedef enum { gnrx, gmry, vol, mon_gmr, mon_vol, temp, ext } SensorTypes;
    

    Die werden ja einfach als "gnrx" oder als "temp" benutzt, also nicht "SensorTypes.gnrx".

    Wie geht den das in groesseren Projekten? Ich mein, der ganze Linux-Kernel ist in C, wie geht den das??

    Hab jetzt

    typedef enum { SensorTypeGnrx, SensorTypeGmry, SensorTypeVol, SensorTypeMon_gmr, SensorTypeMon_vol, SensorTypeTemp, SensorTypeExt } SensorTypes;
    

    damit das ein wenig eindeutiger ist.



  • DEvent schrieb:

    Gibts es wirklich kein namespace in C?

    Nein, leider nicht

    DEvent schrieb:

    Wie macht ihr den das?

    Das macht man mit Prefixen

    DEvent schrieb:

    Denkt ihr euch wirklich zu jeder Funktion einen Prefix aus?

    Würdest du dir für jede Funktion einen namespace ausdenken? 🙄



  • Würdest du dir für jede Funktion einen namespace ausdenken?

    Ein Namespace brauchtman nur einmal hinzuschreiben, einen prefix immer wieder...



  • da musst du wohl dann durch;)

    Edit: Mach doch alles in ein struct 🤡 😉

    //X.c
    
    struct name_space{
    
      int a,b,c;
    
      void A(int ){}
      int B(void ){}
      void C(void){}
    };
    
    name_space.A(name_space.a);
    


  • Ich wußte gar nicht, daß C-struct's schon Memberfunktionen haben können 😉

    Und selbst in C++ würde das so nicht funktionieren - zum Aufrufen einer (nicht-statischen) Methode brauchst du auch ein Objekt:

    struct ns
    {
      ...
    } name_space;
    
    name_space.A(name_space.a);
    


  • upss.. stimmt.. 😉 sorry.... Weis gar nich mehr was in C geht, und was nicht;)



  • DEvent schrieb:

    Wie macht ihr den das? Denkt ihr euch wirklich zu jeder Funktion einen Prefix aus?

    ob Namespace oder Prefix, wo ist der Unterschied?

    // C++ Variante
    abc::func1(...);
    abc::func2(...);
    
    /* C Variante */
    abc_func1(...);
    abc_func2(...);
    

    In der C Variante habe ich sogar ein Zeichen gespart 😃

    Ich mag Namespaces in C++, aber in C kann man auch gut ohne auskommen. Ich bin ehe sowieso der Meinung, dass man keine 2 Funktionen gleich bennen sollten, auch wenn sie in unterschiedlichen Namespaces vorhanden sind. Viele nutzen den "using namespace"-Kram und da würde sowas schief gehen.

    DEvent schrieb:

    Vor allem die enums. Ein paar enums sind:

    typedef enum { gnrx, gmry, vol, mon_gmr, mon_vol, temp, ext } SensorTypes;
    

    Die werden ja einfach als "gnrx" oder als "temp" benutzt, also nicht "SensorTypes.gnrx".

    weiß nicht, was ich dazu sagen soll... syntaktischer Zucker? Wenn ich enums schreibe, dann benenne ich die Werte nach dem Schema ENUMNAME_WERT, das finde
    ich eindeutiger.

    DEvent schrieb:

    Wie geht den das in groesseren Projekten? Ich mein, der ganze Linux-Kernel ist in C, wie geht den das??

    ich verstehe nicht so ganz, was du damit sagen willst bzw. was du da fragst. Guck dir Sourcen von Linux an, wenn du sehen willst, wie das machen. Ich persönlich benutze immer Prefixe und versuche eindeutige Namen zu wählen, ohne dass sie sich wiederholen.



  • supertux schrieb:

    DEvent schrieb:

    Wie macht ihr den das? Denkt ihr euch wirklich zu jeder Funktion einen Prefix aus?

    ob Namespace oder Prefix, wo ist der Unterschied?

    // C++ Variante
    abc::func1(...);
    abc::func2(...);
    
    /* C Variante */
    abc_func1(...);
    abc_func2(...);
    

    In der C Variante habe ich sogar ein Zeichen gespart 😃

    Und in der C++ Variante kann man sich mit entsprechenden using-Direktiven das "abc::" komplett sparen 😉 (ja, das geht in C auch über #define's, abder die sind deutlich fehleranfälliger)



  • CStoll schrieb:

    Und in der C++ Variante kann man sich mit entsprechenden using-Direktiven das "abc::" komplett sparen 😉 (ja, das geht in C auch über #define's, abder die sind deutlich fehleranfälliger)

    Sind aber using-Direktiven auch nicht Fehleranfällig?

    #include <iostream>
    
    namespace abc
    {
        int endl = 9;
    }
    
    using namespace std;
    using namespace abc;
    
    int main(void)
    {   
        cout << "Hello World" << endl;
        return 0;
    }
    

    🕶

    sowas finde ich ganz unschön. Ich verliere den Überlick, wenn ich C++ Code sehe, der tausende using-Direktive benutzt, weil ich nicht mehr erknnen kann, wo was rein gehört. Da finde ich meine Prefixe besser.



  • Ich sehe das ähnlich wie supertux. Namespaces sind schön, aber eigentlich eines der C++-Features die ich bei C am wenigsten vermisse. Und mal ehrlich, Präfixe tippen ist ja nun wirklich nicht der Hauptaufwand...



  • Tim schrieb:

    Ich sehe das ähnlich wie supertux. Namespaces sind schön, aber eigentlich eines der C++-Features die ich bei C am wenigsten vermisse. Und mal ehrlich, Präfixe tippen ist ja nun wirklich nicht der Hauptaufwand...

    Ich finde Prefixe haesslich. Vor allem wenn der Prefix auchnoch mit einem Grossbuchstaben anfaengt oder wenn ein Unterstrich dabei ist _. Ausserdem wird niemand zu Prefixe gezwungen. Gut zu namespace auch nicht, aber ich programmiere seit 2 Jahren nun Java und da sind Pagacke zwingend.
    Ausserdem muss man namespace nur einmal hinschreiben:

    namespace meinFoo
    {
        void foo();
        void bar();
        void fooBar();
    }
    

    Und nicht:

    void meinFoofoo();
    void meinFoobar();
    void meinFoofooBar();
    


  • namespaces sind nett, aber zwingend notwendig nicht. denn sie sind nur die weiterentwicklung von prefixen.

    um zur urspruenglichen frage zurueck zu kehren:
    ja, man verwendet prefixe in C.

    ob es haesslich ist oder nicht, tut nichts zur sache. ein schoenes package system waere natuerlich nett, gibt es aber nicht.



  • Shade Of Mine schrieb:

    um zur urspruenglichen frage zurueck zu kehren:
    ja, man verwendet prefixe in C.

    angeblich soll es noch C-compiler geben, die nur die ersten 8 zeichen eines bezeichners berücksichtigen. 😉

    Shade Of Mine schrieb:

    ein schoenes package system waere natuerlich nett...

    das wäre allerdings genial und würde auch sehr gut zu C passen. vielleicht solltest du's mal der ISO vorschlagen.
    🙂



  • Apeman schrieb:

    Shade Of Mine schrieb:

    um zur urspruenglichen frage zurueck zu kehren:
    ja, man verwendet prefixe in C.

    angeblich soll es noch C-compiler geben, die nur die ersten 8 zeichen eines bezeichners berücksichtigen. 😉

    Was nicht standardkonform wäre.


Anmelden zum Antworten