_ und __



  • Hallo!

    Wofür stehen denn diese Unterstriche?

    zB.:

    double __cdecl atof(
            REG1 const char *nptr
            )
    {
        return _atof_l(nptr, NULL);
    }
    


  • Die verwenden die Leute die deinen Compiler geschrieben haben um dir die normalen Namen nicht wegzunehmen, so kann du eine Funktion cdecl nennen, oder atof_l ohne, dass es einen Konflikt mit den von ihnen benutzten Namen gibt.



  • FrickYY schrieb:

    Die verwenden die Leute die deinen Compiler geschrieben haben um dir die normalen Namen nicht wegzunehmen, so kann du eine Funktion cdecl nennen, oder atof_l ohne, dass es einen Konflikt mit den von ihnen benutzten Namen gibt.

    Und wenn du Unterstriche am Anfang stehen? Bzw. wo ist der Unterschied zwischen _ und __?



  • der Fragende schrieb:

    wo ist der Unterschied zwischen _ und __?

    Das eine ist ein Unterstrich, bei __ sind's zwei Unterstriche.. Worauf willst du hinaus? Ob für den Compiler die Bezeichner "__foo" und "_foo" unterschiedlich sind? Ja, sind sie.



  • Na ob sich hinter _ und __ vor Variablen oder Funktionen eine allgemeingültige Bedeutung verbirgt. Bzw. ob man aus _ oder __ darauf schließen kann, ob die Variable bzw. Funktion eine spezielle Beschaffenheit oder meinetwegen eine besondere eigene Einsatzfunktion hat.



  • der Fragende schrieb:

    FrickYY schrieb:

    Die verwenden die Leute die deinen Compiler geschrieben haben um dir die normalen Namen nicht wegzunehmen, so kann du eine Funktion cdecl nennen, oder atof_l ohne, dass es einen Konflikt mit den von ihnen benutzten Namen gibt.

    Und wenn du Unterstriche am Anfang stehen? Bzw. wo ist der Unterschied zwischen _ und __?

    Wir reden doch von den Unterstrichen am Anfang. Ein Bezeichner darf _, Buchstaben und Zahlen beinhalten. Anfangen darf er mit _ oder Buchstaben.
    Dabei sind alle Bezeichner die mit _ beginnen den Compilerherstellern vorbehalten, d.h. du solltest deine Bezeichner nicht mit einem Unterstrich beginnen.



  • Alter, könnt ihr nicht lesen? Er will wissen, ob sich die Programmierer etwas dabei gedacht haben, manche Funktionen mit "_" und manche mit "__" beginnen, oder ob das Willkür ist.



  • VERMUTLICH HABEN SIE SICH SCHON WAS DABEI GEDACHT 🙄, GEHT AUCH SCHWER OHNE (DENKEN).



  • Compilerbau ohne Denken ist nicht einfach. Ich vermute JA.



  • LOLAlter schrieb:

    Alter, könnt ihr nicht lesen? Er will wissen, ob sich die Programmierer etwas dabei gedacht haben, manche Funktionen mit "_" und manche mit "__" beginnen, oder ob das Willkür ist.

    Reine Willkür. Die Compilerbauer haben alle ihre Bezeichner mit einem Zufallsgenerator erstellt. Das machen sie, um den Code allgemein lesbarer zu machen, denn wenn man zB zwei Funktionen oder Variablen mit ähnlicher Bedeutung ähnliche Bezeichner geben würde, könnte man die ja verwechseln. 😃

    Eine Variable mit dem Namen hallo hat die gleichen Eigenschaften wie eine mit dem Namen _hallo oder __hallo (bis auf den unterscheidlichen Bezeichner natürlich). Die Unterstriche sind Zeichen wie jedes andere (erlaubte) auch. Wozu die benutzt werden wird schon im zweiten Post erklärt.



  • die mit den 2 unterstrichen sind im normalfall schlüsselwörter
    die mit einem bezeichner



  • Die 2 Unterstriche nutzt man zur Funktionsüberladung.

    Z.b. macht

    _divide
    nur so etwas:

    int _divide(int x, int y)
    {
      return x / y;
    }
    

    während
    __divide
    so etwas macht:

    double __divide(double x, double y)
    {
      return x / y;
    }
    

    Wenn man nun mit den Funktionen arbeiten will,
    wird ein Header eingebunden,
    der je nach Define Direktive die richtige
    Funktion auswählt:

    define divide _divide // für Ganzzahlen
    define divide __divide // für Gleitkommazahlen
    

    Und wer nun die divide Funktion normal benutzt und
    die richtige Define Direktive eingesetzt hat,
    der erhält bei den Zahlen 3 und 4
    nun entweder ein int oder ein double als Rückgabewert. 🤡



  • Funktionsüberladung in C?

    #define divide _divide // für Ganzzahlen
    #define divide __divide // für Gleitkommazahlen
    

    Da wird der Präprozessor aber nicht mitspielen.

    Das wäre ja wie z.B.

    #define TRUE 1
    #define TRUE ~0
    


  • ArneS schrieb:

    Funktionsüberladung in C?

    #define divide _divide // für Ganzzahlen
    #define divide __divide // für Gleitkommazahlen
    

    Da wird der Präprozessor aber nicht mitspielen.

    Das wäre ja wie z.B.

    #define TRUE 1
    #define TRUE ~0
    

    Du mußt das natürlich noch in ifdefs einpacken oder das ein oder andere ausklammern.



  • Schlauer Coder schrieb:

    Du mußt das natürlich noch in ifdefs einpacken oder das ein oder andere ausklammern.

    oder sowas

    #define DIVIDE(x,y) sizeof(x)==sizeof(double)?__divide(x,y):_divide(x,y)
    

    aber das ist natürlich alles blödsinn, jedenfalls für division, weil / immer richtig teilt. ob's nun doubles oder ints sind.
    🙂



  • fricky schrieb:

    aber das ist natürlich alles blödsinn, jedenfalls für division, weil / immer richtig teilt. ob's nun doubles oder ints sind.
    🙂

    Nein, denn 4/3 ergibt ein anderes ergebnis als 4.0/3.0.

    Beim ersten kommt 1 raus, beim zweiten 1.3



  • Schlauer Coder schrieb:

    fricky schrieb:

    aber das ist natürlich alles blödsinn, jedenfalls für division, weil / immer richtig teilt. ob's nun doubles oder ints sind.
    🙂

    ... denn 4/3 ergibt ein anderes ergebnis als 4.0/3.0.
    Beim ersten kommt 1 raus, beim zweiten 1.3

    du sagst es und das meine ich ja auch. / 'weiss' selber, ob es ints oder doubles verarbeiten soll. deshalb brauchts's nicht 'überladen' zu werden.
    🙂



  • fricky schrieb:

    Schlauer Coder schrieb:

    Du mußt das natürlich noch in ifdefs einpacken oder das ein oder andere ausklammern.

    oder sowas

    #define DIVIDE(x,y) sizeof(x)==sizeof(double)?__divide(x,y):_divide(x,y)
    

    aber das ist natürlich alles blödsinn, jedenfalls für division, weil / immer richtig teilt. ob's nun doubles oder ints sind.
    🙂

    Das funktioniert auf meiner Maschine mit sizeof(double)==sizefo(int) aber nicht.



  • ^^sach ich's doch, dass es quatsch ist.
    🙂



  • _ steht für Betriebssystemabhängigkeit,
    __ für Compiler- und Betriebssystemabhängigkeit


Anmelden zum Antworten