Was bedeutet #if 0?

Heute habe ich angefangen, MPLAB X zu verwenden, um meine PICs zu programmieren, und habe eine Codevorlage mit mehreren Dateien und Stellen zum Ausfüllen von Code gefunden. Vorher hatte ich eine einzige Datei mit meinem Code darin. In dieser Vorlage, wo ich meine Konfigurationsbits platzieren soll, gibt es folgenden 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 "Remove #if 0 to embed config words." bedeutet... Das ist wahrscheinlich etwas ganz Einfaches. Ich habe versucht zu googeln und im Compiler-Handbuch zu suchen, aber keine guten Ergebnisse erhalten. 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 Config-Bits im Code vs. danach zu tun?

Antworten (3)

Um #if 0 etwas zu erweitern:
Es ist im Wesentlichen ein Hack, um mehrzeilige Kommentare zu ermöglichen. 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 Kommentaren im /* */-Stil verwendet wird, ist, dass Sie den gesamten Block aktivieren können, indem Sie ihn einfach in "#if 1" ändern.

Insbesondere /* */verschachtelt sich nicht. Wenn Sie also einen großen Codeblock mit einem Kommentar umgeben /* */, der bereits einen /* */Kommentar enthält, wird das Ganze nicht korrekt auskommentiert. Ein saubererer 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) eine Zeile wie //#define EMBED_CONFIG_WORDSmit einem Kommentar zu verwenden, der besagt: "Diese Zeile auskommentieren, um das Einbetten von Konfigurationswörtern zu ermöglichen."

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 Config-Bits im Code vs. danach zu tun?

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

Die CONFIG-Direktive von MPASM

Der Assembler von Microchip, MPASM, hat eine nette Funktion, mit der Sie in der Quellcodedatei die ausgewählten Zustände der Konfigurationsbits für dieses Programm angeben können. Dadurch wird sichergestellt, dass beim Programmieren eines Geräts für eine Anwendung auch die gewünschte Konfiguration programmiert wird. Das minimiert das Risiko, die falsche Gerätekonfiguration zu programmieren und sich zu wundern, warum es in der Anwendung nicht mehr funktioniert.

Sie haben genau Recht, der Code zwischen #if 0/#endif wird nie kompiliert. Es ist eine andere Möglichkeit, einen Codeblock auszukommentieren.

Durch das Entfernen von #if 0/#endif werden die __CONFIG-Makros eingeschlossen, die diese Bits in den Konfigurationsbits des PIC aktivieren.