2010-11-29 50 views
3

J'ai plusieurs pilotes utilisant une ressource dans mon code, dont un seul peut être défini. par exemple si j'ai les définitions suivantes: USB_HID, USB_SERIAL, USB_STORAGE. et je veux tester qu'un seul est défini, existe-t-il un moyen simple de le faire? Actuellement, je fais de cette façon:Macro C pour tester: "Si plus d'un défini"

#ifdef USB_HID 
    #ifdef USB_INUSE 
    #error "Can only have one USB device" 
    #else 
    #define USB_INUSE 
    #endif 
#endif 

#ifdef USB_SERIAL 
    #ifdef USB_INUSE 
    #error "Can only have one USB device" 
    #else 
    #define USB_INUSE 
    #endif 
#endif 

... avec l'un de ces blocs pour chaque pilote USB_XXX. Y at-il une façon plus élégante de le faire?

Répondre

9
#if defined(USB_HID) + defined(USB_SERIAL) + defined(USB_STORAGE) != 1 
#error Define exactly one of USB_HID, USB_SERIAL, USB_STORAGE 
#endif 
+0

Belle solution. Je me serais probablement retrouvé avec une vilaine purée de && || les opérateurs. –

+0

Vraiment bien, +1. @Mike Weller: moi aussi :) –

+0

Légende réponse, j'étais inondée d'opérateurs avant de voir ça. – sweetlilmre

0

Oui, utilisez l'opérateur define tels que:

#if defined (USB_HID) && defined (USB_INUSE)

0

Pourquoi ne pas #elif?

#if defined(USB_HID) 
    #define USB_INUSE 
#elif defined(USB_SERIAL) 
    #define USB_INUSE 
#endif