C で関数にデフォルト引数を指定する方法はありますか?
ベストアンサー1
わあ、ここの人はみんな悲観的ですね。答えはイエスです。
これは簡単なことではありません。最終的には、コア関数、サポートする構造体、ラッパー関数、ラッパー関数の周りのマクロが完成します。私の作品では、これらすべてを自動化するマクロのセットを用意しています。フローを理解すれば、同じことを行うのは簡単です。
これについては別の場所にも書いたので、ここでの要約を補足する詳細な外部リンクを次に示します。http://modelingwithdata.org/arch/00000022.htm
私たちは
double f(int i, double x)
デフォルト (i=8, x=3.14) を取る関数に変換します。コンパニオン構造体を定義します。
typedef struct {
int i;
double x;
} f_args;
関数の名前を変更しf_base
、デフォルトを設定してベースを呼び出すラッパー関数を定義します。
double var_f(f_args in){
int i_out = in.i ? in.i : 8;
double x_out = in.x ? in.x : 3.14;
return f_base(i_out, x_out);
}
ここで、C の可変長マクロを使用してマクロを追加します。この方法では、ユーザーは実際に構造体にデータを挿入していることを意識する必要がなくf_args
、通常どおりに実行していると考えることができます。
#define f(...) var_f((f_args){__VA_ARGS__});
これで、次のすべてが機能するようになります。
f(3, 8); //i=3, x=8
f(.i=1, 2.3); //i=1, x=2.3
f(2); //i=2, x=3.14
f(.x=9.2); //i=8, x=9.2
正確なルールについては、複合初期化子がデフォルトを設定する方法に関するルールを確認してください。
1 つだけ機能しないことがあります。f(0)
欠損値とゼロを区別できないためです。私の経験では、これは注意すべきことですが、必要に応じて対処できます。半分の時間では、デフォルトは実際にゼロです。
名前付き引数とデフォルトにより、C でのコーディングが本当に簡単になり、さらに楽しくなると思うので、わざわざこれを書きました。そして、C はとてもシンプルでありながら、これらすべてを可能にするのに十分な機能を備えているので素晴らしいです。