web-dev-qa-db-fra.com

Vérification du préprocesseur si plusieurs définitions ne sont pas définies

J'ai une sélection de #defines dans un en-tête qui sont modifiables par l'utilisateur et je souhaite par la suite vérifier que les définitions existent dans le cas où un utilisateur les supprime complètement, par exemple.

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

Cela fonctionne parfaitement, je me demande cependant s’il existe un meilleur moyen de vérifier si plusieurs définitions ne sont PAS en place ... c’est-à-dire quelque chose comme:

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

ou peut-être

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

pour supprimer le besoin de la section #if vide.

57
Toby
#if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL)
96
Sergey L.

FWIW, @ SergeyL La réponse est excellente, mais voici une légère variante à tester. Notez le changement de logique ou de logique et.

main.c a un wrapper principal comme celui-ci:

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

spi.c, serial.c et usb.c ont des wrappers principaux pour leur code de test respectif comme ceci:

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

config.h qui est inclus dans tous les fichiers c a une entrée comme celle-ci:

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