Frage

Können Sie ein Makro definieren, die eine normale Variable zugreift, sondern in einem Nur-Lese-Mode (außer es als ein Aufruf einer Funktion definiert wurden)? Zum Beispiel kann in dem folgenden Code mit dem VALUE-Makro so definiert werden, dass die dostuff () Funktion einen Compiler-Fehler verursacht?

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. */
}
War es hilfreich?

Lösung

Wenn die Variable immer numerisch ist, das funktioniert:

#define VALUE(x) (x+0)

oder im Zusammenhang mit Ihrem Beispiel

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

Andere Tipps

Ok, ich kam mit einem:

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

Siehe §6.5.17 in dem C-Standard (C99 & C1x): „Ein Komma-Operator keinen L-Wert hat ergeben“

#define VALUE(x) (0, x)

(nicht tragbar C ++).

Versuchen

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

Ist das ein Rätsel, oder ist es eine Engineering-Aufgabe? Wenn es sich um eine technische Aufgabe ist, dann gibt es bessere Möglichkeiten Opazität von Strukturen in C. In Blog-Artikel , schrieb ich eine anständige genug beschrieben, wie in C zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top