width
ポインターをアタッチできる typedef (または構造体) のフィールドのようなものはありません。フィールドは、そのタイプの具体的なオブジェクトにのみ物理的に存在します。したがって、構造体へのポインタを持つことはできませんwidth
。box1.width
などへのポインターのみを持つことができますbox2.width
。
width
既存のすべてのオブジェクトで変更される関数を何らかの方法で作成することはできません。より正確には、そのタイプの既存のすべてのオブジェクトを魔法のように列挙しwidth
、それらのフィールドを変更する関数を作成することはできません。どのオブジェクトを変更したいかを関数に伝えるのは、あなたの責任です。
いずれにせよ、あなたは何をしようとしていますか?
設定する特定のフィールドで実行時にパラメーター化される「セッター」関数を作成しようとしている場合は、オフセットを介して C で実行できます。例えば
void set_value(box *box, size_t offset, int value) {
*(int *) ((char *) box + offset) = value;
}
box box1;
box box2;
box box3;
void set_values(size_t offset, int value)
{
set_value(&box1, offset, value);
set_value(&box2, offset, value);
set_value(&box3, offset, value);
}
通話中
set_values(offset_of(box, width), 42);
の幅を と に設定しbox1
、box2
呼び出しbox3
中42
に
set_values(offset_of(box, height), -5);
これらのオブジェクトの高さを に設定します-5
。
しかし、繰り返しになりますが、変更する必要があるオブジェクトを関数が認識していることを確認するのは、ユーザーの責任です。上記の例では、それらをファイル スコープ変数として宣言しただけです。実際のケースでは、一般的には不可能です。