Pregunta

¿Puede definir una macro que acceda a una variable normal, pero de solo lectura (aparte de definirla como una llamada a una función)? Por ejemplo, ¿se puede definir la macro VALOR en el siguiente código de tal manera que la función dostuff () provoque un error de compilación?

struct myobj {
  int value;
}

/* This macro does not satisfy the read-only requirement */
#define VALUE(o) (o)->value

/* This macro uses a function, unfortunately */
int getvalue(struct myobj *o) { return o->value; }
#define VALUE(o) getvalue(o)

void dostuff(struct myobj *foo) {
   printf("The value of foo is %d.\n", VALUE(foo)); /* OK */
   VALUE(foo) = 1; /* We want a compile error here */
   foo->value = 1; /* This is ok. */
}
¿Fue útil?

Solución

Si la variable siempre es numérica, esto funciona:

#define VALUE(x) (x+0)

o en el contexto de su ejemplo,

#define VALUE(x) (x->value+0)

Otros consejos

Ok, se me ocurrió uno:

#define VALUE(o) (1 ? (o)->value : 0)

Consulte §6.5.17 en el estándar C (C99 & amp; C1x): “Un operador de coma no produce un valor l”.

#define VALUE(x) (0, x)

(No es portátil para C ++.)

Probar

#define VALUE(o) (const int)((o)->value)

¿Es esto un rompecabezas o es una tarea de ingeniería? Si se trata de una tarea de ingeniería, existen mejores formas de obtener la opacidad de las estructuras en C. En este artículo del blog , escribí una descripción bastante decente de cómo hacer eso en C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top