2

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

5 に答える 5

11

わかりました、私は1つ思いつきました:

#define VALUE(o) (1 ? (o)->value : 0)
于 2008-09-26T17:44:05.523 に答える
7

変数が常に数値の場合、これは機能します。

#define VALUE(x) (x+0)

またはあなたの例の文脈では、

#define VALUE(x) (x->value+0)
于 2008-09-26T17:37:44.820 に答える
6

C 標準 (C99 & C1x) の §6.5.17 を参照してください: 「コンマ演算子は左辺値を生成しません。」</p>

#define VALUE(x) (0, x)

(C++ には移植できません。)

于 2011-01-31T18:47:25.747 に答える
2

試す

#define VALUE(o) (const int)((o)->value)
于 2008-09-26T17:39:43.707 に答える
-1

これはパズルですか、それともエンジニアリングタスクですか?それがエンジニアリングタスクである場合、Cで構造体の不透明度を取得するためのより良い方法があります。このブログ記事では、Cでそれを行う方法について十分に説明しました。

于 2008-09-26T17:54:38.977 に答える