zapatos tag ropa preguntas los closet c++ order c-preprocessor

c++ - tag - ¿Importa la orden cuando#defines están usando otras#defines?



tag de los zapatos preguntas (4)

El preprocesador realiza varias ejecuciones y solo finaliza cuando no se encuentran otras ocurrencias de todas las definiciones. Por lo tanto, su código de muestras funciona a la vez, pero el preprocesador necesita una ejecución más en caso de que la segunda. Hay que tener cuidado con las definiciones recursivas. El ppc entonces nunca saldría.

De acuerdo con la respuesta a esta pregunta , el siguiente código es legítimo:

#define three 3 #define nine three*3 int main() { std::cout << nine; return 0; }

Y claro, compila y funciona bien. Sin embargo, la respuesta a la pregunta mencionada también indica que uno debe tener cuidado con el orden de tales directivas #define , y otro que se usará en otros #define s debe definirse antes que ellos. Pero el siguiente código:

#define nine three*3 #define three 3 int main() { std::cout << nine; return 0; }

También compila y funciona bien, e imprime "9".

¿Mi compilador me deja libre o el orden no importa con #defines que usan otros #define s? ¿Fallaría la compilación en un proyecto más complicado?

Una cosa que vale la pena mencionar es que la pregunta mencionada habla de C , mientras que mi código está en C ++. ¿Es ahí de donde vienen las (supuestas) diferencias de comportamiento?


En realidad, es debido a dos pasos analizador. En el primer paso intenta resolver todos los símbolos y en el segundo paso se coloca el valor real.


Estos pasos se harían en el paso del preprocesador y todos los literales serían reemplazados con su valor. Esto se puede verificar si compilamos con la opción:

$ g ++ -save-temps basic.cpp -o fuera

Esta es la salida después del paso del preprocesador (archivo basic.ii):

int main() { std::cout << 3*3; return 0; }

para su programa de muestra. Por lo tanto, el orden no debe ser importante, ya que se trata de buscar y reemplazar, y se realiza antes de la compilación real del programa.


three macro solo deben definirse antes del uso de nine macro. Incluso puedes cambiar three antes de cada uso de nine :

#define nine three*3 #define three 3 int main() { std::cout << nine; //9 #undef three #define three 4 std::cout << nine; //12 #undef three //no `three` macro defined here int three = 2; std::cout << nine; //three * 3 == 6 return 0; }