edition - minecraft wiki
Cambiar una macro en tiempo de ejecuciĆ³n en C (5)
Tengo una macro definida. Pero necesito cambiar este valor en tiempo de ejecución dependiendo de una condición. ¿Cómo puedo implementar esto?
Dependiendo de lo que quieras hacer, puedes hacerlo de varias maneras.
Variable global en lugar de macro
// someincludefile.h
extern static int foo;
// someincludefile.c
static int foo = 5;
// someotherfile.c
#include "someincludefile.h"
printf("%d/n", foo); // >> 5
foo = -5;
printf("%d/n", foo); // >> -5
Condición que puede alternar
// someincludefile.h
extern static int condition;
#define FOO1 (5)
#define FOO2 (-5)
#define FOO (condition ? (FOO1) : (FOO2))
// someincludefile.c
static int condition = 1;
// someotherfile.c
#include "someincludefile.h"
printf("%d/n", FOO); // >> 5
condition = 0;
printf("%d/n", FOO); // >> -5
Condición evaluada local y dinámicamente
// someincludefile.h
#define CONDITION (bar >= 0)
#define FOO1 (5)
#define FOO2 (-5)
#define FOO ((CONDITION) ? (FOO1) : (FOO2))
// someotherfile.c
#include "someincludefile.h"
int bar = 1;
printf("%d/n", FOO); // >> 5
bar = -1;
printf("%d/n", FOO); // >> -5
En este último, la CONDICIÓN se evaluará como si su código estuviera en su ámbito local, por lo que puede usar variables locales y / o parámetros en él, pero también puede usar variables globales si lo desea.
Las macros son reemplazadas por el preprocesador por su valor antes de que el archivo original se compile. No hay forma de que pueda cambiar el valor de la macro en tiempo de ejecución.
Si puede explicar un poco más sobre el objetivo que está tratando de lograr, sin duda hay otra forma de resolver su problema que no incluye macros.
No puede cambiar la macro en sí, es decir, a qué se expande, pero potencialmente puede cambiar el valor de una expresión que involucra la macro. Para un ejemplo muy tonto:
#include <stdio.h>
#define UNCHANGEABLE_VALUE 5
#define CHANGEABLE_VALUE foo
int foo = 5;
int main() {
printf("%d %d/n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
CHANGEABLE_VALUE = 10;
printf("%d %d/n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
}
Entonces, la respuesta a su pregunta depende del tipo de efecto que desee que tenga su cambio en el código que usa la macro.
Por supuesto, 5
es una constante de tiempo de compilación, mientras que foo
no lo es, por lo que esto no funciona si planea usar CHANGEABLE_VALUE
como una etiqueta de case
o lo que sea.
Recuerde que hay dos (en realidad más) etapas de traducción de la fuente C. En el primero (de los dos que nos importan), las macros se expanden. Una vez hecho todo esto, el programa se "analiza sintáctica y semánticamente", como lo expresa 5.1.1.2/2. Estos dos pasos a menudo se conocen como "preprocesamiento" y "compilación" (aunque de manera ambigua, todo el proceso de traducción también se conoce como "compilación"). Incluso pueden ser implementados por programas separados, con el "compilador" ejecutando el "preprocesador" según sea necesario, antes de hacer cualquier otra cosa. Así que el tiempo de ejecución es demasiado tarde para intentar retroceder y cambiar a lo que se expande una macro.
No puedes. Las macros se expanden por el Preprocessor , lo que sucede incluso antes de que se compile el código. Es un reemplazo puramente textual.
Si necesita cambiar algo en tiempo de ejecución, simplemente reemplace su macro con una llamada de función real.
No puedes.
Como una macro se resuelve por el preprocesador antes de la compilación en sí, su contenido se copia directamente donde lo usa.
Aún puede usar parámetros para insertar una instrucción condicional dependiendo de lo que desee, o use una variable accesible de alcance de llamada.
Si desea cambiar un solo valor, mejor utilice la variable de ámbito global, incluso si se desaconseja tal comportamiento. (como el uso intensivo de macro)