_ und __



  • 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



  • johny_legend schrieb:

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

    Was mir schon bei mehreren embedded- Compilern untergekommen ist, daß aus (Inline-) ASM- Sicht die Funktionsnamen auf Label mit führendem Unterstrich abgebildet werden, also so

    void MyFunction(void)
    {
    	// do something
    }
    // ...
    asm("	jsr.w	_MyFunction	; MyFunction ausführen");
    

    Das tiefere Schema dahinter ist mir zwar nicht 100%ig klar, 😕 nehme aber an, daß so die Sichtbarkeit der Namensräume auf Assemblerebenen gehandelt wird. Beim Disassemblieren sind mir auch schon Library- Funktionen aufgefallen, die mit "__" bzw. drei Underscores daherkommen.
    Würde für johny_legends Erklärung sprechen ...



  • ^^mit dem _ (und anderen 'decorations') werden zusätzliche informationen für den linker angehängt. z.b. macht der msvc aus einer funktion 'hello()' mit der calling convention 'cdecl' ein '_hello'. hat sie die calling convention 'stdcall', dann macht er daraus '_hello@0'. das hat nix mit underscores zu tun, die im c-quelltext auftauchen. eine 'cdecl _hello()' würde z.b. zu '__hello' (also mit 2 _, den davorgebastelten vom compiler und den vom funktionsnamen).
    🙂


Anmelden zum Antworten