_ und __
-
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.3du 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ängigkeitWas 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).