Präprozessorprüfung, wenn nicht mehrere Definitionen definiert sind

Lesezeit: 2 Minuten

Tobys Benutzeravatar
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.

    – 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

#if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL)

  • 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

1417380cookie-checkPräprozessorprüfung, wenn nicht mehrere Definitionen definiert sind

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy