Para responder a sus preguntas, piense para qué macros se usan predominantemente (Advertencia: código compilado por el cerebro).
- Macros utilizadas para definir constantes simbólicas
#define X 100
Esto se puede reemplazar fácilmente con: const int X = 100;
- Las macros solían definir (esencialmente) funciones independientes de tipo en línea
#define max(X,Y) (X>Y?X:Y)
En cualquier lenguaje que admita la sobrecarga de funciones, esto se puede emular de una manera mucho más segura mediante la sobrecarga de funciones del tipo correcto o, en un lenguaje que admita genéricos, mediante una función genérica. La macro felizmente intentará comparar cualquier cosa, incluidos punteros o cadenas, que podrían compilarse, pero es casi seguro que no es lo que quería. Por otro lado, si hizo que las macros sean seguras, no ofrecen beneficios ni conveniencia sobre las funciones sobrecargadas.
- Las macros solían especificar accesos directos a elementos de uso frecuente.
#define p printf
Esto se reemplaza fácilmente por una función p()
que hace lo mismo. Esto está bastante involucrado en C (que requiere que use la va_arg()
familia de funciones), pero en muchos otros lenguajes que admiten números variables de argumentos de función, es mucho más simple.
El soporte de estas características dentro de un lenguaje en lugar de en un lenguaje macro especial es más simple, menos propenso a errores y mucho menos confuso para otros que leen el código. De hecho, no puedo pensar en un solo caso de uso para macros que no se pueda duplicar fácilmente de otra manera. El único lugar donde las macros son realmente útiles es cuando están vinculadas a construcciones de compilación condicional como #if
(etc.).
En ese punto, no discutiré con usted, ya que creo que las soluciones no preprocesadoras para la compilación condicional en lenguajes populares son extremadamente engorrosas (como la inyección de código de bytes en Java). Pero lenguajes como D han creado soluciones que no requieren un preprocesador y no son más engorrosos que el uso de condicionales de preprocesador, aunque son mucho menos propensos a errores.