Tengo una selección de #define un encabezado de usuario editables, así que posteriormente deseen comprobar que la define existen en el caso de que un usuario elimina por completo, por ejemplo,

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

Esto funciona perfectamente bien, me pregunto sin embargo si hay una mejor manera de comprobar si varias define NO están en el lugar… es decir, algo como:

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

o tal vez

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

para eliminar la necesidad de que el vacío #si la sección.

  • FYI: defined es un operador que se invoca como una función (como sizeof. Así que si usted lo llama como una función, su ejemplo va a funcionar bien. También puede utilizar la mayoría de los operadores lógicos (==, !=, !, ||, &&) en las instrucciones del preprocesador así.
  • Es un principio general del álgebra de boole que puede reemplazar !(x && y) con (!x || !y). en.wikipedia.org/wiki/De_Morgan%27s_laws
InformationsquelleAutor Toby | 2013-06-21

2 Comentarios

  1. 98
    #if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL)
    • Es necesario añadir los paréntesis, o puede ser «#si!!!define COD || …»?
    • De lo que está escrito arriba, yo diría que «sí». Yo podría estar equivocado; esto es sólo una suposición.
    • En realidad no, pero yo la recomendaría para mejorar la legibilidad. godbolt.org/g/O48eun
    • De verdad? Esto parece más fácil de leer para mí, pero podría ser simplemente una preferencia personal: #if !defined MANUF || !defined SERIAL || !defined MODEL
    • Uno de los beneficios de los paréntesis es que si MANUF pasa a ser una instrucción compuesta (es decir. 1 + 1), entonces usted va a ser la comprobación de la declaración completa, no sólo la primera pieza de la misma.
  2. 2

    FWIW, @SergeyL la respuesta es genial, pero aquí es una ligera variante de la prueba. Nota el cambio en la lógica o a la lógica y.

    principal.c tiene un principal de contenedor como este:

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

    spi.c, de serie.c y usb.c tener contenedores para su respectiva prueba de código como este:

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

    config.h
    Que está incluido en todos los c archivos tiene una entrada como esta:

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

Dejar respuesta

Please enter your comment!
Please enter your name here