El 99,9% de los programas en C++ utilizan macros. A menos que esté creando un archivo básico, debe escribir #include , que es una macro que pega el texto contenido en un archivo. Y no importa la extensión del archivo. Las macros son muy poderosas y pueden hacer cosas que ni siquiera templates , lambdas , constexpr , inline o cualquier compilación futura del compilador podrán hacer.
Lo que pasa con el compilador CPP , y en general con los compiladores, o el lenguaje, es que está diseñado para restringir los accidentes. Como usar un tipo como otro tipo, no establecer el estado del objeto antes de usar el objeto, no liberar memoria, usar un valor de basura, en el caso de Java , acceder a la memoria fuera de los límites, etc. Todo esto está bien, de hecho errores ser atrapado más fácilmente, pero por otro lado, restringe al programador de hacer cosas útiles.
Luego, los creadores de lenguajes terminan teniendo que idear medios para eludir estas restricciones. Por ejemplo, Java tiene su biblioteca JNI para conectarse a DLL de C y C++ .
El problema es que Java no tiene macros . Además, Java es un lenguaje muy literal.
Java.util.something.member(.....
Por otro lado, C++ puede usar macros para nombres más cortos.
#define BIT64 (8) #define TYPE std::conditional<size of(int) == BIT64, int, short>::type #define TRUE (std::is_same<TYPE, int>::value) #define TRY_ENABLE std::enable_if<TRUE, TYPE>::type TRY_ENABLE func(){}; #undef // every definition
Estos ilustran muchos usos de las macros:
- Puede convertir una declaración larga en una declaración corta.
- Con un nombre que le da un significado a la declaración, es más fácil entender la macro que el extenso código detrás de ella.
- Es directo al grano. No necesita estar en un espacio de nombres ni contaminar el espacio de nombres con la declaración de uso.
- Las macros no se limpian solas, pero eso es bueno, un programador puede decidir cuándo debe existir la macro y limpiar para que otro archivo pueda usar la macro cómodamente. Compare eso con CPP utilizando directivas que persisten para siempre.
- Además, dado que las macros se originaron en C, lo que ves es lo que obtienes. Lo que C. ¡Consíguelo! El ++ en C++ significa C en dobles. Con cosas como ADL , constructores creados por defecto, hay muchas formas en que CPP puede noquearlo. Las macros, por otro lado, son muy simples, pero muy poderosas.
- Observe también cómo el número 8 se convirtió en un nombre identificado. La alternativa CPP son variables const , funciones constexpr . Probablemente, constexpr proporciona los mismos resultados sin sobrecarga de tiempo de ejecución. Pero declarar una variable const solo para hacer que el código sea más legible parece una pérdida de memoria. ¿Por qué asignar memoria solo para dar un nombre a un valor? Luego, cuando pasa esa variable a un parámetro, puede incurrir en otro costo de asignación de memoria. Con la Macro solo se realiza un costo de asignación. Eso es pasar el valor de la macro al parámetro.
Por lo tanto, las macros no solo acortan los nombres y, de hecho, typedefs y alias de referencia también se pueden usar para acortar los nombres, sino que las macros también pueden evitar los gastos generales de tiempo de ejecución . Las macros suceden mucho antes del tiempo de ejecución. Las macros han evitado el exceso de tiempo de ejecución mucho antes que las funciones de CPP , como mover y plantilla .