Präprozessorprüfung, wenn nicht mehrere Definitionen definiert sind
Lesezeit: 2 Minuten
Tobi
Ich habe eine Auswahl von #defines in einem Header, die vom Benutzer bearbeitet werden können, und möchte daher anschließend überprüfen, ob die Definitionen vorhanden sind, falls ein Benutzer sie vollständig löscht, z
#if defined MANUF && defined SERIAL && defined MODEL
// All defined OK so do nothing
#else
#error "User is stoopid!"
#endif
Das funktioniert einwandfrei, ich frage mich jedoch, ob es einen besseren Weg gibt, um zu überprüfen, ob mehrere Definitionen NICHT vorhanden sind … dh so etwas wie:
#ifn defined MANUF || defined SERIAL ||.... // note the n in #ifn
oder vielleicht
#if !defined MANUF || !defined SERIAL ||....
um die Notwendigkeit des leeren #if-Abschnitts zu beseitigen.
FYI: defined ist ein Operator, der wie eine Funktion aufgerufen wird (genau wie sizeof. Wenn Sie es also wie eine Funktion aufrufen, wird Ihr Beispiel gut funktionieren. Außerdem können Sie die meisten logischen Operatoren verwenden (==, !=, !, ||, &&) auch in Präprozessoranweisungen.
Ist es notwendig, die Klammern hinzuzufügen, oder kann es “#if !defined MANUF || …” sein?
– TimK
10. Oktober 2016 um 14:50 Uhr
@TimK Nach dem, was oben geschrieben steht, würde ich “ja” sagen. Ich könnte mich irren; das ist nur eine vermutung.
– wizzwizz4
28. November 2016 um 18:35 Uhr
Eigentlich nicht, aber ich würde es für die Lesbarkeit empfehlen. godbolt.org/g/O48eun
– T’n’E
16. März 2017 um 10:20 Uhr
Wirklich? Dies scheint mir einfacher zu lesen, aber es könnte nur eine persönliche Vorliebe sein: #if !defined MANUF || !defined SERIAL || !defined MODEL
– kayleeFrye_onDeck
15. September 2017 um 19:24 Uhr
Ein Vorteil für die Eltern ist, dass wenn MANUF zufällig eine zusammengesetzte Aussage ist (z. B. 1 + 1), dann überprüfen Sie die ganze Aussage, nicht nur das erste Stück davon.
– Tyler
13. Dezember 2017 um 14:06 Uhr
FWIW, die Antwort von @SergeyL ist großartig, aber hier ist eine leichte Variante zum Testen. Beachten Sie die Änderung von logisch oder zu logisch und.
main.c hat einen Haupt-Wrapper wie diesen:
#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 ihren jeweiligen Testcode wie folgt:
#ifdef TEST_USB
int main(int argc, char *argv[]) {
// the main() routine for testing the usb code.
}
config.h, die in allen c-Dateien enthalten ist, hat einen Eintrag wie diesen:
// 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
14173800cookie-checkPräprozessorprüfung, wenn nicht mehrere Definitionen definiert sindyes
FYI:
defined
ist ein Operator, der wie eine Funktion aufgerufen wird (genau wiesizeof
. Wenn Sie es also wie eine Funktion aufrufen, wird Ihr Beispiel gut funktionieren. Außerdem können Sie die meisten logischen Operatoren verwenden (==
,!=
,!
,||
,&&
) auch in Präprozessoranweisungen.– Richard J.Ross III
21. Juni 2013 um 14:21 Uhr
Es ist ein allgemeines Prinzip der booleschen Algebra, das Sie ersetzen können
!(x && y)
mit(!x || !y)
. en.wikipedia.org/wiki/De_Morgan%27s_laws– Vicky
21. Juni 2013 um 15:09 Uhr