una que programar programacion preprocesamiento macro lenguaje funcion estructura ejemplos directivas defines declaracion constantes como c++ c templates macros

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 .