Nehmen wir ein Beispiel:
extern volatile __bit TRISB0 @ (((unsigned) &TRISB)*8) + 0;
Ich glaube, dies zeigt TRISB0
auf die entsprechende Bitadresse. Aber ich verstehe nicht, warum __bit
anstelle von bit
der XC8-Datentyp verwendet wird.
Ich habe versucht, eine Erklärung für __bit
im XC8-Benutzerhandbuch und anderswo zu finden, aber ohne Erfolg.
Steht schwarz auf weiß in der Bedienungsanleitung...
bit
und __bit
sind bis auf die Kompatibilität genau gleich:
Wenn das xc8-Flag --STRICT verwendet wird, ist das Schlüsselwort bit nicht mehr verfügbar, aber Sie können das Schlüsselwort __bit verwenden.
bit
Sie können also für Ihren eigenen Datentyp, Variablennamen, Funktionsnamen, was immer Sie wollen, verwenden , wenn Sie --STRICT in der Befehlszeile angeben, und immer noch verwenden __bit
, um ein Bit anzugeben.
Die Option --STRICT wird verwendet, um die strenge ANSI-C-Konformität aller speziellen, nicht standardmäßigen Schlüsselwörter zu aktivieren. Der MPLAB XC8 C-Compiler unterstützt verschiedene spezielle Schlüsselwörter (z. B. den Persistent Type Qualifier). Wenn die Option --STRICT verwendet wird, werden diese Schlüsselwörter so geändert, dass sie zwei Unterstriche am Anfang des Schlüsselworts enthalten (z. B. __persistent), um dem ANSI-Standard strikt zu entsprechen. Wenn Sie also diese Option verwenden, müssen Sie den Qualifizierer __persistent in Ihrem Code verwenden, nicht persistent.
__bit
. Als erstes suchte ich das Dokument nach __bit
.Dies ist wahrscheinlich eher eine allgemeine Programmierfrage als eine Elektronikfrage, aber da diese Gruppe in gewissem Maße die Programmierung eingebetteter Systeme umfasst, werde ich sie hier beantworten.
Der C-Standard verspricht, dass der Code jeden syntaktisch gültigen Bezeichner verwenden kann, ohne das Risiko eines Konflikts mit irgendwelchen implementierungsdefinierten Bezeichnern, vorausgesetzt dass:
#include <name>
Syntax für Kopfzeilen, die nicht durch den Standard definiert sind.Ein standardkonformer Compiler muss einem C-Programm erlauben, eine Variable, eine Funktion oder einen Typ mit dem Namen zu deklarieren bit
. Wenn ein Compiler selbst einen Typ definieren würde bit
, der Benutzercode jedoch versuchte, diesem Namen eine andere Bedeutung zuzuweisen, würden die beiden Verwendungen in Konflikt geraten. standardkonforme Compiler dürfen solche Konflikte mit standardkonformem Code nicht haben.
__bit
Indem der Compiler statt bit
als Namen für seinen eigenen Bittyp verwendet , stellt er sicher, dass der Name keinen unzulässigen Konflikt erzeugt. Während ein solcher Name immer noch mit einem benutzerdefinierten Bezeichner desselben Namens in Konflikt stehen könnte, würde der Standard einer Implementierung erlauben, im Falle eines Konflikts mit einem solchen Namen zu tun, was sie will. Die meisten Compiler werden davon absehen, etwas völlig Böses zu tun (z. B. so zu tun, als würden sie normal kompilieren, aber Code generieren, der nichts anderes tun würde, als endlos "FRINK RULES!" an alle angeschlossenen UARTs auszugeben), aber der Standard erlaubt Compiler-Autoren, zu tun, was sie wollen keinerlei Einschränkung im Falle solcher Namenskonflikte).
KyranF