1. ホーム
  2. c

[解決済み] C 言語の構造体におけるデフォルト値

2023-02-28 17:31:27

質問

このようなデータ構造を持っています。

struct foo {
    int id;
    int route;
    int backup_route;
    int current_route;
}

と、それに対する変更を要求するために使用される update() という関数があります。

update(42, dont_care, dont_care, new_route);

これは本当に長く、もし私が構造体に何かを追加したら、update( ... )へのすべての呼び出しに 'dont_care' を追加しなければなりません。

代わりに構造体を渡すことを考えていますが、構造体に事前に 'dont_care' を記入することは、関数呼び出しでそれを綴ることよりもさらに面倒です。dont_care のデフォルト値で構造体をどこかに作成し、ローカル変数として宣言した後に、気になるフィールドを設定するだけでよいのでしょうか。

struct foo bar = { .id = 42, .current_route = new_route };
update(&bar);

表現したい情報だけをupdate関数に渡すには、どのような方法が最もエレガントでしょうか?

そして、他のすべてをデフォルトの-1(「気にしない」の秘密のコード)にしたいのです。

どのように解決するのですか?

マクロや関数 (すでに提案されているもの) は機能しますが (そして他のプラスの効果 (すなわちデバッグフック) もあるかもしれません)、それらは必要以上に複雑です。最もシンプルで、おそらく最もエレガントな解決策は、変数の初期化に使用する定数を定義することです。

const struct foo FOO_DONT_CARE = { // or maybe FOO_DEFAULT or something
    dont_care, dont_care, dont_care, dont_care
};
...
struct foo bar = FOO_DONT_CARE;
bar.id = 42;
bar.current_route = new_route;
update(&bar);

このコードでは、インダイレクトを理解するための精神的なオーバーヘッドがほとんどありません。 bar のどのフィールドを明示的に設定し、設定しないフィールドは(安全に)無視するのかが非常に明確です。