_ 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.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).