code - c vs c++ diferencias



Maneras simples de deshabilitar partes de código (10)

A veces utilizo el truco a continuación para cambiar entre dos comentarios vagos .

//* <-- remove the first slash
[code block 1]
/*/
[code block 2]
//*/

https://ffff65535.com

Esta no es una pregunta típica para resolver un problema específico, es más bien un ejercicio mental, pero me pregunto si alguien tiene una solución.

En desarrollo, a menudo necesitamos deshabilitar o cambiar algunas partes del código para verificar diferentes enfoques. Para hacer esto, usamos comentarios o #defines , pero mi favorito es:

//*
[code here]
//*/

Ahora cuando elimine solo la primera barra, el código quedará descompuesto.

La pregunta: ¿hay alguna forma de implementar un cambio de código if-else similar? Traté de encontrarlo pero siempre tuve algún problema y no pude encontrar una solución funcional.

¿Y tal vez conoces trucos similares?


Algunas veces utilizo este enfoque para no sobrepasar el código por una secuencia infinita de definiciones if-endif.

debug.hpp

#ifdef _DEBUG
    #define IF_DEBUG(x) if(x)
#else
    #define IF_DEBUG(x) if(false)
#endif

ejemplo.cpp

#include "debug.hpp"

int a,b, ... ,z;

...

IF_DEBUG(... regular_expression_here_with_a_b_z ...) {
    // set of asserts
    assert(... a ...);
    assert(... b ...);
    ...
    assert(... z ...);
}

Esto no siempre es efectivo, porque el compilador puede advertirle sobre las variables no utilizadas que se han utilizado dentro de dichos bloques de código deshabilitados. Pero al menos es mejor leer y las advertencias variables no utilizadas se pueden suprimir, por ejemplo, así:

IF_DEBUG(... regular_expression_here_with_a_b_z ...) {
    // set of asserts
    assert(... a ...);
    assert(... b ...);
    ...
    assert(... z ...);
}
else {
    (void)a;
    (void)b;
    ....
    (void)z;
}

No siempre es una buena idea, pero al menos ayuda a reorganizar el código.


El preprocesador if-else también funciona

#if 1
  // ... enabled if 1
#else
  // ... enabled if 0
#endif

En mi código, me gusta hacer esto en mi archivo main.cpp:

#define CRAZY_EXPERIMENT

#ifdef TEST
#include "Test.h"
#elif ANOTHER_TEST
#include "AnotherTest.h"
#elif CRAZY_EXPERIMENT
#include "CrazyExperiment.h"
#else

int main(int argc, int * argv[]){
    runTheProgramLikeNormal();
}

#endif

Los archivos de encabezado que ve todos contienen su propio main() . Solo hay una función main () en el programa basada en lo que se define en el primer #define allí. Si la declaración se omite por completo, se establece de manera predeterminada en la función principal canónica () que ve escrita.

Esto hace que sea más fácil escribir pruebas para mi programa que solo se enfocan en uno o dos componentes por sí mismos. Y la mejor parte es que los encabezados de prueba están cuidadosamente en cuarentena de mi código, por lo que no se deja ningún código de prueba (o incluso vinculado) por error.


Macro es la manera de hacer esto ...

#define COMPILE 

#ifdef COMPILE

//code to comment begins
cout<<"ha ha ha"<<endl;
//code to comment ends 

#endif

Para deshabilitar el código, simplemente comente #define compile line


No estoy seguro de que deba publicar esto porque no es algo que creo que sea 'buen código', pero admitiré haber usado la siguiente técnica como una forma rápida y sucia de poder cambiar rápidamente entre dos pequeños fragmentos de código cuando estoy comprobando algo:

// in the following , foo() is active:
/**/ foo(); /*/ bar(); /**/

Ahora solo elimina uno de los asteriscos en el frente:

// now bar() is active:
/*/ foo(); /*/ bar(); /**/

Por supuesto, esto nunca debería pasar de la fase de "solo verificar cosas" ...


Sincronizadamente encender / apagar trozos de código dispersos por el programa a veces también es necesario.

Inspirado por este artículo anterior de Graham , cociné algo así:

void doNothing(){}
#define DO_IF(flag, code) flag ? code : doNothing();

Esto se puede usar, por ejemplo, de la siguiente manera:

DO_IF(collectStats, recordStats());
DO_IF(collectStats, store(pullStat()));

Una que es aún mejor:

#define DO_IF(flag,code) if( flag ) { code; }

Use alguna lógica de preprocesador para ayudarlo aquí:

#if 0
    //code goes here
#endif

Disfrutar


#if 0
...disabled code here
#endif

1 ? foo() : bar();

Esto ejecuta foo() . Cambie el 1 a un 0 para ejecutar la bar() lugar.

A diferencia de las sugerencias que implican directivas o comentarios de preprocesador, se compilan las dos ramas posibles, de modo que obtiene el beneficio completo de la verificación de sintaxis del compilador.





c