2013-06-21 13 views
41

Ich habe eine Auswahl von #defines in einer Kopfzeile, die Benutzer editierbar sind und so möchte ich später überprüfen, ob die Definitionen vorhanden sind, falls ein Benutzer sie vollständig löscht, z.Präprozessor prüfen, ob mehrere Definitionen nicht definiert sind

#if defined MANUF && defined SERIAL && defined MODEL 
    // All defined OK so do nothing 
#else 
    #error "User is stoopid!" 
#endif 

Das funktioniert völlig in Ordnung, ich frage mich aber, ob es einen besseren Weg, wenn mehrere definiert anstelle NICHT zu überprüfen ist, sind ... also so etwas wie:

#ifn defined MANUF || defined SERIAL ||.... // note the n in #ifn 

oder vielleicht

#if !defined MANUF || !defined SERIAL ||.... 

, um die Notwendigkeit für die leere #if Abschnitt zu entfernen.

+3

FYI: 'defined' ein Operator ist, der ist aufgerufen wie eine Funktion (genau wie 'sizeof'. Also, wenn Sie es wie eine Funktion nennen, wird Ihr Beispiel gut funktionieren. Außerdem können Sie die meisten logischen Operatoren ('==', '! =', '!', '||', '&&') auch in Präprozessoranweisungen verwenden. –

+4

Es ist ein allgemeiner Grundsatz der Booleschen Algebra, dass Sie '! (X && y)' durch '(! X ||! Y)' ersetzen können. http://en.wikipedia.org/wiki/De_Morgan%27s_laws – Vicky

Antwort

69
#if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL) 
+0

Ist es notwendig, die Parens hinzuzufügen oder kann es "#if! definiert MANUF || ..." sein? – TimK

+0

@TimK Von dem, was oben geschrieben ist, würde ich "ja" sagen. Ich könnte mich irren. Das ist nur eine Annahme. – wizzwizz4

+2

Eigentlich nicht, aber ich würde es für die Lesbarkeit empfehlen. https://godbolt.org/g/O48eun –

1

FWIW, @ SergeyLs Antwort ist großartig, aber hier ist eine leichte Variante zum Testen. Beachten Sie die Änderung in logisch oder in logisch und.

main.c hat einen Haupt Wrapper wie folgt aus:

#if !defined(TEST_SPI) && !defined(TEST_SERIAL) && !defined(TEST_USB) 
int main(int argc, char *argv[]) { 
    // the true main() routine. 
} 

spi.c, serial.c und usb.c haben Haupt Wrapper für den jeweiligen Test-Code wie folgt aus:

#ifdef TEST_USB 
int main(int argc, char *argv[]) { 
    // the main() routine for testing the usb code. 
} 

config.h , die von allen c-Dateien enthalten ist, hat einen Eintrag wie folgt aus:

// Uncomment below to test the serial 
//#define TEST_SERIAL 


// Uncomment below to test the spi code 
//#define TEST_SPI 

// Uncomment below to test the usb code 
#define TEST_USB 
Verwandte Themen