Was ist __bit im XC8 C-Compiler?

Nehmen wir ein Beispiel:

extern volatile __bit TRISB0 @ (((unsigned) &TRISB)*8) + 0;

Ich glaube, dies zeigt TRISB0auf die entsprechende Bitadresse. Aber ich verstehe nicht, warum __bitanstelle von bitder XC8-Datentyp verwendet wird.

Ich habe versucht, eine Erklärung für __bitim XC8-Benutzerhandbuch und anderswo zu finden, aber ohne Erfolg.

Ich denke, Double __ wird meiner Meinung nach für reservierte Variablen/Namen verwendet

Antworten (2)

Steht schwarz auf weiß in der Bedienungsanleitung...

bitund __bitsind 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.

bitSie 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.

Können Sie mir sagen, wo Sie das Benutzerhandbuch bekommen haben? Meine Version lautet "... wird nicht verfügbar." Keine Erwähnung von __bit. Als erstes suchte ich das Dokument nach __bit.
Ich habe gerade Google danach gefragt, und es hat mir die Website von Microchip gegeben: ww1.microchip.com/downloads/en/DeviceDoc/…
Sehr gut (weiß nicht, wie ich an eine ältere Version gekommen bin).

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:

  1. Der Benutzercode verwendet keine #include <name>Syntax für Kopfzeilen, die nicht durch den Standard definiert sind.
  2. Der Identifizierer steht nicht in Konflikt mit irgendwelchen, die in dem Standard als mit Headern assoziiert erwähnt werden, die unter Verwendung der oben erwähnten Syntax enthalten sind.
  3. Der Bezeichner beginnt nicht mit zwei Unterstrichen.

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.

__bitIndem der Compiler statt bitals 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).

Es ist jetzt alles so klar.