通常の変数にアクセスするマクロを、読み取り専用の方法で (関数の呼び出しとして定義する以外に) 定義できますか? たとえば、次のコードの 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. */
}