Was macht #if 0?

8

Heute habe ich begonnen, meine PICs mit MPLAB X zu programmieren, und eine Codevorlage mit mehreren Dateien und Stellen zum Ausfüllen von Code gefunden. Bevor ich eine einzelne Datei mit meinem Code darin hatte. In dieser Vorlage, in der ich meine Konfigurationsbits ablegen soll, befindet sich folgender Text:

/* TODO Fill in your config bits here.  Remove #if 0 to embed config words.   */

#if 0

/* General syntax for configuration word 1 - Check your device .h file
for an up to date listing of available macros.*/
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF);

/* If the device has multiple configuration words, the second macro defines
the second configuration word.  Again check your device .h file
for an up to date listing of available macros. */
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_19 & LVP_OFF);

#endif

Ich verstehe nicht wirklich, was das "Entfernen von #if 0, um Konfigurationswörter einzubetten" ist. bedeutet ... Das ist wahrscheinlich etwas wirklich Einfaches. Ich habe versucht zu googeln und das Compiler-Handbuch zu durchsuchen, aber keine guten Ergebnisse erzielt. Soweit ich verstehen kann, wird der Code zwischen #if 0 und #endif nie kompiliert. Was bedeutet diese Einbettung? Hat es etwas mit dem Setzen der Konfigurationsbits im Code im Vergleich zu danach zu tun?

varesa
quelle

Antworten:

17

Um ein bisschen auf #if 0 zu erweitern:
Es ist im Wesentlichen ein Hack, mehrzeilige Kommentare zuzulassen. Der Präprozessor, der vor dem Compiler ausgeführt wird, entfernt alles zwischen #if 0 und dem passenden #endif.

Ein Grund, warum es anstelle von / * * / style-Kommentaren verwendet wird, ist, dass Sie den gesamten Block aktivieren können, indem Sie ihn einfach in "#if 1" ändern.

exscape
quelle
9
Insbesondere /* */wird nicht verschachtelt. Wenn Sie also einen großen Codeblock umgeben /* */, in dem bereits ein /* */Kommentar enthalten ist, wird das Ganze nicht korrekt auskommentiert. Ein sauberer Ansatz für diese Bibliothek wäre jedoch gewesen, #if defined EMBED_CONFIG_WORDSanstelle von #if 0und dann (möglicherweise in einer separaten Konfigurationsdatei oder so etwas) eine Zeile wie //#define EMBED_CONFIG_WORDSmit einem Kommentar zu verwenden, der besagt: "
BlueRaja - Danny Pflughoeft
5

Soweit ich verstehen kann, wird der Code zwischen #if 0 und #endif nie kompiliert.

Ja.

Was bedeutet diese Einbettung? Hat es etwas mit dem Setzen der Konfigurationsbits im Code im Vergleich zu danach zu tun?

Konfigurationsbits sind ein speziell programmiertes Register im PIC, das den Betrieb des Oszillators, die Brown-Out-Erkennung und andere Dinge bestimmt. Aus einem der Referenzhandbücher : (Das Makro __CONFIG in C wird der entsprechenden Direktive in Assembly zugeordnet.)

KONFIG-Richtlinie des MPASM

Der Assembler von Microchip, MPASM, verfügt über eine nette Funktion, mit der Sie in der Quellcodedatei die ausgewählten Zustände der Konfigurationsbits für dieses Programm angeben können. Dies stellt sicher, dass beim Programmieren eines Geräts für eine Anwendung auch die erforderliche Konfiguration programmiert wird. Dies minimiert das Risiko, die falsche Gerätekonfiguration zu programmieren und sich zu fragen, warum sie in der Anwendung nicht mehr funktioniert.

Jason S.
quelle
3

Ihr genau richtig, der Code zwischen dem #if 0 / # endif wird nie kompiliert. Es ist eine andere Möglichkeit, einen Codeblock zu kommentieren.

Das Entfernen des Endifs #if 0 / # enthält die Makros __CONFIG, mit denen diese Bits in den Konfigurationsbits des PIC aktiviert werden.

Jim A.
quelle