c++ - type - Generando un error si la macro booleana marcada no está definida
definir boolean en c++ (4)
¿Qué hay de usar la opción del preprocesador -Wundef
gcc? Esto solo generará una advertencia, que se puede convertir fácilmente en un error con -Werror=undef
.
Tengo varios archivos de configuración, cada uno de los cuales contiene la definición de alguna macro booleana, que debe configurarse en 0 o 1. Luego, en mi código, verifico el valor de dicha macro para decidir qué parte del código activar. Ahora viene la parte difícil: quiero asegurarme de que se haya incluido el encabezado que contiene la definición de mi macro.
En el siguiente ejemplo, si olvido incluir el archivo de encabezado que contiene la definición de FOO, el compilador imprimirá "world!", Mientras que me gustaría que generara un error.
//in the configuration header file
#define FOO 1
//in a cpp file
#if FOO //I would like this to generate an error if I forgot to include the header file
#pragma message "Hello"
#else
#pragma message "world!"
#endif
¿Es posible lograr tal comportamiento? ¿Cómo?
Para aclarar, no estoy preguntando cómo generar un error si una macro no está definida , pero si es posible transformar la línea #if FOO
para que, al mismo tiempo, verifique el valor booleano y genere un error si FOO
no está definido.
El punto de tener esto sería que los desarrolladores sabrían que su código debería contener
SPECIAL_MACRO(FOO)
que, al mismo tiempo, verifica el valor booleano de FOO como si fuera una declaración #if FOO
, y evita que olviden la inclusión del encabezado que define FOO
.
Creo que puede resolver su problema en una solución difícil simple. Cambio su código como se muestra a continuación y mi código comprende que header.h no existe y me muestra un error.
#if FOO == 1
#pragma message "Hello"
#elif FOO == 2
#pragma message "world!"
#else
throw std::invalid_argument("Header didn''t add to project");
#endif
solo necesitas cambiar tu valor inicial para Foo. porque el compilador activa Foo == 0 cuando no encuentra FOO, no debe usar el valor 0 para su configuración. debe dejar cero para la situación de ausencia de encabezado. En lugar de eso, debe usar valores mayores que cero (1, 2, 3, ...).
Foo == 0 situación de ausencia.
Foo == 1 Configuración 1.
Foo == 2 Configuración 2.
.
.
.
La respuesta aceptada de usar macros de función es buena, pero si desea mantener las macros normales, y aún así utilizar el valor de FOO si está definido y generar un error, de lo contrario podría hacerlo:
#if FOO / defined(FOO)
#else
#endif
Si FOO
no está definido, activará la división entera por cero.
Los colegas (hola Hartmut, Kurt) que mantuvieron una base de código grande que fue configurada extensamente con #define
s se encontraron exactamente en el mismo problema. Una simple falta de ortografía, posiblemente en un archivo de creación, podría provocar errores sutiles que eran difíciles de rastrear. Su solución: utilizar macros de función! En
#if SOME_COND()
// ...
#endif
el compilador se queja si SOME_COND () no está definido, a diferencia de un SOME_COND simple que será reemplazado por 0 si no está definido. Me gusta porque se puede usar para transportar varios valores sin saturar el código con #ifdef
s adicionales.