¿Cómo puedo implementar no-op macro en C++?

#include <iostream>   

#ifdef NOOP       
    #define conditional_noop(x) what goes here?   
#else       
    #define conditional_noop(x) std::cout << (x)   
#endif   
int main() {       
    conditional_noop(123);   
}

Quiero que este a no hacer nada cuando se NOOP es definido y de impresión «123», cuando NOOP no está definido.

  • Si el uso de msvc, el __noop intrínseca debe ser de interés para usted, y a diferencia de algunos de los presentados en las soluciones, no obtendrá algo como un accidental colgando más

9 Comentarios

  1. 24

    Como se mencionó antes – nada.

    También, hay un error en su código.

    debe ser #else no #elif. si es #elif es seguido por la nueva condición

    #include <iostream>   
    
    #ifdef NOOP       
        #define conditional_noop(x) do {} while(0)
    #else       
        #define conditional_noop(x) std::cout << (x)   
    #endif  

    Divertirse de codificación!
    EDIT: agregado el [hacer] construcción de robustez, como se sugiere en otra respuesta.

    • el de arriba es incorrecta. si usted tiene conditional_noop dentro de un bloque de control no es rodeado por llaves. Ver avakar la solución para el sólido de manera que siempre tendrá a su trabajo.
  2. 52

    Dejando en blanco es la opción más obvia, me gustaría ir con

    #define conditional_noop(x) do {} while(0)

    Este truco es, obviamente, no-op, pero obliga a escribir un punto y coma después de conditional_noop(123).

    • Responder de manera útil para mí! En mi caso, necesitaba no-op algún nivel de kernel printfs). Para una persona que quiere aquí, para hacer un argumento de variable noop macro, uno puede hacer #define conditional_noop(x,...) do {} while(0)
    • Esto dejará una advertencia del compilador que la expresión es constante, sin embargo.
    • en msvc va, aunque me sorprende que eres el primero de los que se quejan 🙂 Tenemos esta advertencia movilidad por esta razón.
  3. 16

    La definición de la macro a ser void transmite su intención bien.

    #ifdef NOOP
        #define conditional_noop(x) (void)0
    #else
    • Usted debe tener (void)0 desde (void); es un error de compilación
    • Gracias, corregido. 15char
  4. 13
     #ifdef NOOP       
         #define conditional_noop(x)   
     #elif  

    nada!

    • No pude compilar de esta manera. El problema es que yo solía #elif vez de usar el conexión de #else. Ahora lo tengo a la derecha. Gracias.
    • tienes razón… yo solo copié que a partir de su ejemplo.
  5. 6
    #ifdef NOOP
        static inline void conditional_noop(int x) { }
    #else 
        static inline void conditional_noop(int x) { std::cout << x; }
    #endif

    Utilizando la función inline void permite la comprobación de tipos, incluso cuando NOOP no está definido. Así que cuando NOOP no está definido, todavía no será capaz de pasar de una estructura a una función o una variable no definida.
    Finalmente esto le impiden llegar errores del compilador cuando se enciende el NOOP bandera.

    • +1 para el único (hasta ahora, de todos modos) solución no mediante una macro. Pero, ¿qué es la static para? Y no sería mejor hacer esto de una plantilla para que no acaba de aceptar int?
    • La estática elimina errores del vinculador si la definición que existe en un archivo de encabezado que se incluye en varios .archivos cpp. El cambio a una función de plantilla funcionaría muy bien, pero que iba a quitar la comprobación de tipo (especialmente cuando NOOP está definido, ya que nada se hace con x).
  6. 4

    Como otros han dicho, deje en blanco.

    Un truco que debe usar es para agregar (void)0 a la macro, obligando a los usuarios a añadir un punto y coma después de ella:

    #ifdef NOOP       
        #define conditional_noop(x) (void)0
    #else       
        #define conditional_noop(x) std::cout << (x); (void)0
    #endif  

    En C++, (void)0 no hace nada. En este artículo se explica otros no-tan-buenas opciones, así como la justificación de los mismos.

    • Al tener dos declaraciones en la segunda macro, han obligado a los usuarios a utilizar los apoyos cuando se otra forma no sería necesario, y el olvido de las llaves puede o no puede tener un efecto en el programa. La sección vinculada a explica cómo evitar el problema.
  7. 2

    Como se trata de una macro, también se debe considerar un caso como

    if (other_cond)
        conditional_noop(123);

    para estar en el lado seguro, usted puede dar una declaración vacía como

    #define conditional_noop(X) {}

    para mayores C a veces es necesario definir el vacío de la declaración de esta manera (también deben recibir optimizado de distancia):

    #define conditional_noop(X) do {} while(0)
    • El do-while truco no tiene nada que ver con la edad del compilador.
    • Que mal entendido la razón detrás de usar do { } while (0) y, en consecuencia, su primer código no es suficiente y que no iba a funcionar. Para ver por qué, imagine que su código de ejemplo de arriba había un else rama …
  8. 0

    Creo que una combinación de las anteriores variantes es una buena solución:

    #ifdef NOOP
        static inline void conditional_noop(int x) do {} while(0)
    #else 
        static inline void conditional_noop(int x) do { std::cout << x; } while(0)
    #endif

    Lo bueno es que estos dos códigos difieren sólo dentro de un bloque, lo que significa que su comportamiento con el exterior es completamente idéntico para el analizador.

    • Te das cuenta de que es una función, no una macro, haga?

Dejar respuesta

Please enter your comment!
Please enter your name here