マクロを変数への読み取り専用アクセスに使用できますか?

StackOverflow https://stackoverflow.com/questions/140825

  •  02-07-2019
  •  | 
  •  

質問

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

解決

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

#define VALUE(x) (x+0)

または例のコンテキストで

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

他のヒント

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

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

C標準の§ 6.5.17(C99& C1x)を参照:“コンマ演算子は左辺値を生成しません。”

#define VALUE(x) (0, x)

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

試用

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top