No conozco Objective-C, por lo que mi respuesta será sobre contrastar el uso del preprocesador en C y C++.
El preprocesador fue originalmente necesario para C por varias razones. Si no recuerdo mal, originalmente C no tenía constantes, por lo que #define era necesario para evitar los números mágicos. Antes de 1999, C no tenía funciones en línea, por lo que #define nuevamente se usaba para crear macros o "pseudo-funciones" para guardar la sobrecarga de una llamada de función, manteniendo el código estructurado. C tampoco tiene polimorfismo en tiempo de ejecución ni en tiempo de compilación, por lo que se necesitan #ifdefs para la compilación condicional. Los compiladores generalmente no eran lo suficientemente inteligentes como para optimizar el código inalcanzable, por lo que, una vez más, se usaron #ifdefs para insertar el código de depuración o de diagnóstico.
El uso del preprocesador en C++ es un retroceso a C, y en general se desaprueba. Las funciones de idioma, como las constantes, las funciones en línea y las plantillas, pueden utilizarse en la mayoría de las situaciones en las que en C hubiera utilizado el preprocesador.
Los pocos casos donde el uso de un preprocesador en C++ es aceptable o incluso necesario incluyen las protecciones para los archivos de cabecera, para evitar que el mismo encabezado se incluya varias veces, #ifdef __cplusplus
para usar el mismo encabezado para ambas C y C++, __FILE__ y __LINE__ para el registro, y algunos otros.
El preprocesador también se utiliza a menudo para definiciones específicas de plataforma, aunque C++ Gotchas de Stephen Dewhurst recomienda tener directorios de inclusión separados para las definiciones específicas de plataforma y usarlos en configuraciones de compilación separadas para cada plataforma.
Aprendimos de C. Con C/C++/Objective-C, obtuvieron el compilador de C en ese momento justo encima de él porque era más fácil de esa manera. Los idiomas más recientes se diseñaron mejor desde cero. La mayoría de las personas que conozco con antecedentes de C que se han mudado tienen miedo de los preprocesadores. No es bueno para la velocidad, arruina tu diseño, perjudica la comprensión. Ninguna ventaja, excepto que le permite escribir un código peor: ¿por qué alguien podría copiar eso a propósito? –
Ver http://stackoverflow.com/questions/652788/what-is-the-worst-real-world-macros-pre-processor-abuse-youve-ever-come-across y http: //blogs.msdn. com/oldnewthing/archive/2005/01/06/347666.aspx :) –
Tengo varios programas dsp en C++ donde cada ciclo cuenta (sí, realmente). El preprocesador me ayuda bastante durante la optimización. No lo uso para nada más. Lo amo. No podrías sacarlo de mis manos. ¿Has realizado una gran cantidad de programación dsp en tiempo real en esos lenguajes dinámicos? Recuerda que no importa cuántos tipos de programación hayas hecho, simplemente has arañado la superficie de los tipos de programación que se pueden hacer. – Nosredna