2013-06-21 13 views
41

Mam wybór #defines w nagłówku, który można edytować przez użytkownika, a następnie chciałbym sprawdzić, czy definicje istnieją, na wypadek gdyby użytkownik usunął je całkowicie, np.Sprawdzanie preprocesora, jeśli nie zdefiniowano wielu definicji

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

Działa to doskonale OK, zastanawiam się jednak, czy jest lepszy sposób, aby sprawdzić, czy wielokrotne definiuje NIE są na miejscu ... czyli coś jak:

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

czy może

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

aby usunąć potrzebę pustej sekcji #if.

+3

FYI: "zdefiniowany" to operator, który jest wywoływana jak funkcja (tak jak 'sizeof'. Więc jeśli nazwiesz to jak funkcją, twój przykład będzie działał dobrze. Również - możesz użyć większości operatorów logicznych ('==', '! =', '!', '||', '&&') również w instrukcjach preprocesora. –

+4

Jest to ogólna zasada algebry Boole'a, którą możesz zastąpić '! (X && y)' z '(! X ||! Y)'. http://en.wikipedia.org/wiki/De_Morgan%27s_laws – Vicky

Odpowiedz

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

Czy konieczne jest dodanie parensów czy może to być "#if! defined MANUF || ..."? – TimK

+0

@TimK Z tego, co napisano powyżej, powiedziałbym "tak". Mógłbym się mylić; to tylko założenie. – wizzwizz4

+2

Właściwie to nie, ale polecam go dla czytelności. https://godbolt.org/g/O48eun –

1

FWIW, @ Odpowiedź SergeyL jest świetna, ale tutaj jest niewielki wariant do testowania. Zwróć uwagę na zmianę logiczną lub logiczną i.

main.c ma główny opakowanie takiego:

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

spi.c, serial.c i usb.c mają główne owijarki do ich odpowiedniego kodu testowego tak:

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

config.h Który jest zawarty we wszystkich plikach c ma taki wpis:

// 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 
Powiązane problemy