que - ¿Cómo implemento macro(o plantilla) no operativa en C++?
lenguaje c++ ejemplos (9)
Como esto es una macro, también debes considerar un caso como
if (other_cond)
conditional_noop(123);
para estar seguro, puedes dar una declaración vacía como
#define conditional_noop(X) {}
para C mayores, algunas veces necesitas definir la declaración vacía de esta manera (también debería optimizarse):
#define conditional_noop(X) do {} while(0)
¿Cómo implemento una macro no operativa 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 esto no haga nada cuando se define NOOP e imprime "123", cuando NOOP no está definido.
Como han dicho otros, déjelo en blanco.
Un truco que debe usar es agregar (void)0
a la macro, forzando a los usuarios a agregar 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. Este artículo explica otras opciones no tan buenas, así como las razones detrás de ellas.
Como se mencionó antes, nada.
Además, hay un error de impresión en su código.
debería ser #else no #elif . si es #elif debe ser 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
Diviértete codificando! EDITAR: agregó la construcción [do] para robustez como se sugiere en otra respuesta.
Creo que una combinación de las variantes anteriores 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 solo dentro de un bloque , lo que significa que su comportamiento para el exterior es completamente idéntico para el analizador.
Definir la macro como void
transmite bien tu intento.
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
Mientras que dejarlo en blanco es la opción obvia, iría con
#define conditional_noop(x) do {} while(0)
Este truco es obviamente no-op, pero te obliga a escribir un punto y coma después de conditional_noop(123)
.
Puedes dejarlo en blanco. No necesita seguir el #define
con nada.
#ifdef NOOP
#define conditional_noop(x)
#elif
¡nada!
#ifdef NOOP
static inline void conditional_noop(int x) { }
#else
static inline void conditional_noop(int x) { std::cout << x; }
#endif
El uso de la función vacía en línea habilita la verificación de tipos, incluso cuando NOOP
no está definido. Entonces, cuando NOOP
no está definido, aún no podrá pasar una estructura a esa función, o una variable indefinida. Esto eventualmente evitará que obtenga errores de compilación cuando encienda el indicador de NOOP
.