Можно ли использовать макрос для доступа к переменной только для чтения? - PullRequest
2 голосов
/ 26 сентября 2008

Можете ли вы определить макрос, который обращается к нормальной переменной, но только для чтения (кроме определения его как вызова функции)? Например, можно ли определить макрос VALUE в следующем коде таким образом, чтобы функция dostuff () вызывала ошибку компиляции?

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. */
}

Ответы [ 5 ]

11 голосов
/ 26 сентября 2008

Хорошо, я придумал один:

#define VALUE(o) (1 ? (o)->value : 0)
7 голосов
/ 26 сентября 2008

Если переменная всегда числовая, это работает:

#define VALUE(x) (x+0)

или в контексте вашего примера

#define VALUE(x) (x->value+0)
6 голосов
/ 31 января 2011

См. §6.5.17 в стандарте C (C99 и C1x): «Оператор запятой не дает lvalue».

#define VALUE(x) (0, x)

(не переносимо на C ++.)

2 голосов
/ 26 сентября 2008

Попробуйте

#define VALUE(o) (const int)((o)->value)
0 голосов
/ 26 сентября 2008

Это головоломка или инженерная задача? Если это инженерная задача, то есть лучшие способы получить непрозрачность структур в C. В этой статье блога я написал достаточно приличное описание того, как это сделать в C.

...