c++ - que - libreria para fflush stdin
Forzar al compilador a ignorar algunas lĂneas en el programa (8)
Respuesta corta:
Utilizar macros y #ifdef
check. Por ejemplo:
#ifdef MY_CONTROL_MACRO
...
#endif
el código dentro de este ámbito solo se compilará si ya definió la macro MY_CONTROL_MACRO
.
Mas cosas:
Para definir tal macro, puede
- Agregue
#define MY_CONTROL_MACRO
a su código. O, - Para VS, agregue
MY_CONTROL_MACRO
aProject > Properties > C/C++ > Preprocessor > Preprocessor Definitions
. O, - Para GCC, compile su código con la opción
-DMY_CONTROL_MACRO
.
- Agregue
Puedes echar un vistazo here para más información.
Este bloque se llama un grupo condicional. el texto controlado se incluirá en la salida del preprocesador si y solo si se define MACRO. Decimos que el condicional tiene éxito si se define MACRO, falla si no lo es.
El texto controlado dentro de un condicional puede incluir directivas de preprocesamiento. Se ejecutan sólo si el condicional tiene éxito. Puede anidar grupos condicionales dentro de otros grupos condicionales, pero deben estar completamente anidados. En otras palabras, ''#endif'' siempre coincide con el ''#defdef'' más cercano (o ''#ifndef'', o ''#if''). Además, no puede iniciar un grupo condicional en un archivo y finalizarlo en otro.
También puede usar el estilo avanzado
ifdef-else-endif
:#ifdef MY_CONTROL_MACRO ... // this part will be valid if MY_CONTROL_MACRO is defined #else ... // this part will be valid if MY_CONTROL_MACRO is NOT defined #endif
Supongamos que tengo 10.000 líneas de código C ++. 200 líneas de este código son para propósitos de prueba (por ejemplo, verifique el programa y muestre un mensaje de error).
¿Hay una forma en C ++ de ignorar o considerar algunas líneas del código (tal vez con palabras clave del preprocessor )?
El camino a seguir es usar la directiva de preprocesador con la define
pasada al compilador o tomada de un encabezado "config.h":
#if defined(DEBUG) // or #ifdef DEBUG
// Debug code
#endif
Para evitar utilizar en todas partes en el código fuente:
#if defined(DEBUG)
My_Debug_function(some_variable)
#endif
Usted puede hacer en el encabezado
#if !defined(DEBUG) // or #ifndef DEBUG
# define My_Debug_function(some_variable) do { static_cast<void>(some_variable); } while (false) /* Do nothing */
#endif
Y así, use My_Debug_function
casi normalmente.
Esto es para lo que fue diseñado #ifdef
Pones
#ifdef TESTS
... test code ...
#endif
y luego puede pasar a las opciones del compilador para decidir si desea que la parte de prueba se compile o no. Por ejemplo con g ++ es
g++ -DTESTS ...
Rodee el código con "#ifdef ... # endif", y luego use las opciones del compilador para establecer el indicador:
#ifdef MYTEST_ONLY_FUNCTIONALITY_ENABLED
...
#endif
A continuación, puede utilizar las opciones del compilador para incluir este código. Por ejemplo, en GCC:
-DMYTEST_ONLY_FUNCTIONALITY_ENABLED
Aunque, para ser honesto, creo que este enfoque generalmente no es muy fácil de mantener en grandes proyectos y, si es posible, generalmente es mejor simplemente mover el código de solo prueba a una biblioteca completamente separada (sin esta lógica condicional) y simplemente vincular eso codifique en su binario de prueba en lugar de su binario no de prueba. Eso también evita tener que compilar cada una de las otras bibliotecas en los modos de depuración y no de depuración.
Usar un protector de preprocesador es definitivamente el enfoque más flexible y común. Sin embargo, cuando sea posible, sugiero usar una sentencia if. Por ejemplo, en lugar de
void example(int a){
int some_local;
...
#ifdef _DEBUG
std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
#endif
....
}
Suponiendo que ENABLE_DEBUG se define como 0 o no cero, usaría
void example(int a){
int some_local;
...
if(ENABLE_DEBUG) std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
...
}
Dado que ENABLE_DEBUG es una constante, cuando ENABLE_DEBUG es 0, el compilador no generará ningún código para las declaraciones que protege. Entonces, ¿por qué usar este método en lugar de #ifdef?
- Si hay muchas declaraciones de depuración separadas en todo el código, puede ser un poco más fácil de leer.
- Más importante aún, el código siempre se procesa para los errores sintácticos, incluso si no se genera ningún código. Esto puede ser muy útil si el código de depuración no se habilita con frecuencia. Si las variables cambian (por ejemplo, en el ejemplo anterior, si se cambió el nombre del argumento a), la persona que realiza el cambio sabrá que también deben actualizar la declaración de depuración. Si se usan #ifdefs, entonces puede ocultar la podredumbre de bits hasta que alguien necesite habilitar el código de depuración y luego deben intentar reparar el código, algo que puede no ser obvio para ellos.
Obviamente, este enfoque solo funciona para las declaraciones de depuración dentro de los cuerpos de método / función.
Utilice el preprocesador #define y #if
Dependiendo de tu compilador, deberías tener algunas variables disponibles por defecto, por ejemplo, NDEBUG (para no depurar) o DEBUG
Usted puede definir una variable usted mismo en el código por
#define MY_VARIABLE
y usarlo de la siguiente manera
#ifdef MY_VARIABLE
//code that compiles only if MY_VARIABLE is defined
printf("test output here");
#else
//code that compiles only if MY_VARIABLE is NOT defined
printf("MY_VARIABLE is not defined");
#endif
para más información busque en línea para
#define, #if, #ifdef, #ifndef
Vaya con la convención existente y use la macro NDEBUG
. Todos los compiladores comunes definen esta macro para las compilaciones de lanzamiento y no la definen para las compilaciones de depuración .
La macro originalmente existía para controlar la salida de assert(3)
, y se define como tal en el estándar POSIX y al menos desde C89.
Tenga en cuenta que tiene que revertir la prueba con #ifndef
.
Un ejemplo:
#ifndef NDEBUG
/* Debugging code */
std::cerr << "So far we have seen " << unicorns << " unicorns" << std::endl;
#endif
PS Con gcc
/ g++
, haces una compilación de depuración agregando -g
a la línea de comandos.
#ifdef DEBUG
su código de prueba #ifdef DEBUG
.
#if DEBUG
....
#endif