2013-06-21 18 views
41

Kullanıcının düzenlenebilir bir üstbilgisinde #defines seçimlerim var ve bu nedenle, bir kullanıcının bunları tamamen silmesi durumunda tanımların var olduğunu kontrol etmek istiyorum. Birden tanımlar ... yerinde DEĞİL olup olmadığını kontrol etmek daha iyi bir yolu olup olmadığınıÖnişlemci, birden çok tanım tanımlanmamış olup olmadığını kontrol edin

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

Bu mükemmel Tamam çalışır, ben ancak merak ediyorum yani bir şey gibi:

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

ya da belki

Boş #if bölümüne olan ihtiyacı ortadan kaldırmak için
#if !defined MANUF || !defined SERIAL ||.... 

.

+3

: bütün c dosyaları tarafından dahildir config.h böyle bir giriş vardır 'defined' bir operatörüdür bir işlev gibi çağrılır (tıpkı “sizeof” gibi). Yani eğer bir işlev gibi çağırırsanız, örneğiniz iyi çalışır. Ayrıca - önişlemci deyimlerinde de çoğu mantıksal işleçleri ('==', '! =', '!', '||', '&&) kullanabilirsiniz. –

+4

Bu, '(x && y)' ile '' (! X ||! Y) 'arasında değiştirebileceğiniz boole cebri genel bir ilkesidir. http://en.wikipedia.org/wiki/De_Morgan%27s_laws – Vicky

cevap

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

Parens eklemek gerekli mi, yoksa "#if! tanımlı MANUF || ..." olabilir mi? – TimK

+0

@TimK Yukarıda yazılandan, "evet" derdim. Ben yanlış olabilirim; Bu sadece bir varsayımdır. – wizzwizz4

+2

Aslında yapmıyorsunuz, ancak okunabilirlik için öneriyorum. https://godbolt.org/g/O48eun –

1

FWIW, @ SergeyL'nin yanıtı harika, ancak burada test için küçük bir değişken var. Mantıksal veya mantıksal değişime dikkat edin.

main.c böyle bir ana sargıyı var

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

spi.c, serial.c ve usb.c bu gibi ilgili bir test kodu için ana sarma sahiptir:

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

Bilginize

// 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