Como complemento de las respuestas anteriores, si realmente quería comprobar la validez de proceso de un archivo de origen dos veces — que es casi definitivamente no lo que realmente quiere hacer — siempre se puede invocar el compilador de esta manera:
g++ -E input.cpp | g++ -c -x c++ - -o output.o
es decir, ejecute el archivo a través del preprocesador, a continuación, ejecute la salida procesada previamente a través de la tubería a través de una rutina de recopilación completa, incluyendo un segundo paso de procesamiento previo. Para que esto tenga una posibilidad razonablemente buena de funcionar, me imagino que tendrías que ser bastante cuidadoso en la forma en que definiste y usaste tus macros, y en general es probable que no valga la pena y aumente la compilación. hora.
Si realmente quiere macros, use soluciones estándar basadas en macros. Si realmente quieres metaprogramación en tiempo de compilación, usa plantillas.
En una nota ligeramente relacionada, esto me recuerda que el lenguaje de trazado de rayos POV-Ray hizo un uso intensivo de un lenguaje de preprocesamiento bastante complejo, con directivas de control de flujo como #while
que permitían la repetición condicional, cálculos en tiempo de compilación, y otras cosas así. Ojalá fuera así en C++, pero simplemente no lo es, así que lo hacemos de otra manera.