salta que programa porque para limpiar libreria funcion flushall c++ preprocessor-directive

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:

  1. Para definir tal macro, puede

    • Agregue #define MY_CONTROL_MACRO a su código. O,
    • Para VS, agregue MY_CONTROL_MACRO a Project > Properties > C/C++ > Preprocessor > Preprocessor Definitions . O,
    • Para GCC, compile su código con la opción -DMY_CONTROL_MACRO .
  2. 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.

  3. 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?

  1. Si hay muchas declaraciones de depuración separadas en todo el código, puede ser un poco más fácil de leer.
  2. 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