Kann ein Makro für den Lesezugriff auf eine Variable verwendet werden?
-
02-07-2019 - |
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. */
}
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.