Para responder às suas perguntas, pense sobre o uso predominante das macros (Aviso: código compilado pelo cérebro).
- Macros usadas para definir constantes simbólicas
#define X 100
Isso pode ser facilmente substituído por: const int X = 100;
- Macros usadas para definir (essencialmente) funções agnósticas de tipo em linha
#define max(X,Y) (X>Y?X:Y)
Em qualquer idioma que ofereça suporte à sobrecarga de funções, isso pode ser emulado de uma maneira muito mais segura, tendo funções sobrecarregadas do tipo correto ou, em um idioma que suporte genéricos, por uma função genérica. A macro tentará com prazer comparar qualquer coisa, incluindo ponteiros ou seqüências de caracteres, que podem ser compiladas, mas quase certamente não é o que você queria. Por outro lado, se você tornou as macros seguras para o tipo, elas não oferecem benefícios ou conveniência em relação às funções sobrecarregadas.
- Macros usadas para especificar atalhos para elementos usados com frequência.
#define p printf
Isso é facilmente substituído por uma função p()
que faz a mesma coisa. Isso está bastante envolvido em C (exigindo o uso da va_arg()
família de funções), mas em muitas outras linguagens que suportam números variáveis de argumentos de funções, é muito mais simples.
O suporte a esses recursos em um idioma e não em um idioma macro especial é mais simples, menos propenso a erros e muito menos confuso para outras pessoas que leem o código. Na verdade, não consigo pensar em um único caso de uso para macros que não possam ser facilmente duplicadas de outra maneira. O único lugar em que as macros são realmente úteis é quando elas estão vinculadas a construções de compilação condicional como #if
(etc.).
Nesse ponto, não discutirei com você, pois acredito que soluções sem pré-processador para compilação condicional em linguagens populares são extremamente complicadas (como a injeção de bytecode em Java). Mas linguagens como D criaram soluções que não exigem um pré-processador e não são mais complicadas do que usar condicionais do pré-processador, além de serem muito menos propensas a erros.