El problema no es sobre la teoría: siempre que, por alguna razón, desee tener una macro que se expanda de manera diferente según el valor de un parámetro que se le pase, y este parámetro es una constante, conocida por la macro preprocesador, no hay ninguna razón por la que no podría funcionar ... para un macroprocesador genérico ... Pero desafortunadamente, cpp no permite la presencia de otros "comandos" de macroprocesador en una definición de macro ...
Así que su
#define foo(x) \
#if x>32 \
x \
#else \
2*x \
#endif
no se expande a
#if X>32
X
#else
2*X
#endif
donde X es el parámetro conocido (por lo que cambiar X a, por ejemplo 31), que requiere otro pase por el preprocesador.
Además, las nuevas líneas se ignoran, aunque son importantes para dicho uso; de lo contrario, el siguiente podría ser considerado como un truco (que necesitan otro paso de procesamiento previo, sin embargo)
#define foo(x,y) \
y if x>32 \
x \
y else \
2*x \
y endif
que con foo(20,#)
produce
# if 20>32 20 # else 2*20 # endif
que funciona, si sería
# if 20>32
20
# else
2*20
# endif
... pero no es (y como se dijo, la salida del preprocesador debe ser alimentada al preprocesador nuevamente ...)
Así que mi respuesta es que si necesita estas cosas, no puede usar el preprocesador C; debería usar un preprocesador C poco común (¿no estándar?), o simplemente otro macroprocesador, y si necesita el tipo de cosas que "cpp" tiene que "integrarse" con C, entonces no puede usar una genérica (como M4) tan fácilmente ...
¿Puedo preguntar por qué necesita una macro para esto? Una función sería mucho más limpia y (tipo) más segura. –
Si sabe lo suficiente como para hacer esta pregunta, debe olvidar que existe la construcción '#define foo (x)', ya que solo le ayudará a escribir el código que, si funciona, lo hace por accidente. – msw
Quiero que el preprocesador C realice la evaluación instaurada del control de flujo de tiempo de ejecución. de esta manera ahorrar tiempo en tiempo de ejecución – richard