- ベストアンサー
C言語での引数の省略方法
お世話になります。 C言語での関数の引数の省略方法についてお聞きしたいです。 たとえば、CalA(x,y,z)という関数があるとします。 このzの部分を使用しないときは省略という風にしたいのです。 CalA("あ","い","う"); CalA("あ","い"); ↑このようにどちらにも対応したい。 VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1です > char型の場合は > void CalA(int x,int y,char *z='') それでOKです。 ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。 危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。 ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。
その他の回答 (4)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
Cでは'不可能'です。 C++なら簡単ですが。 他の方からの回答にあるように、可変引数という テがありますが、これだと引数の型と数について なんのチェックも行なわれず、コンパイラはエラー を報告しなくなります。危険を顧みないなら十分 な留意の上お使いください。
お礼
回答ありがとうございます。 不可能なのですか・・・ No1のやり方でOKだと思ったのですが。 たとえば使用する際にint型の所にchar型を指定してもwarningがでなくなるということですよね?
お使いになるのがC++でしたら先の回答者の方々の方法でOKです。 しかし、ただのCでしたら、簡単には実装できません。 この場合は、printf()などと同じような実装方式になります。 va_arg、va_end、va_start マクロ群を利用します。 int average( int first, ... ) { va_list marker; int a[10]; a[0] = first; va_start( marker, first ); a[1] = va_arg( marker, int); a[2] = va_arg( marker, int); a[3] = va_arg( marker, int); va_end( marker ); /* 可変個の引数のリセット */ } という感じです。
お礼
回答ありがとうございます。 このような方法もあるのですね。 No1の方の方法が求めているものでした。 かといってこちらの方法も知っておいて損はありませんでした。 知識が増えました。ありがとうございました。
- mld_sakura
- ベストアンサー率20% (264/1282)
可能です。 オーバーロードを使用します。 ここを参考にしてください。 http://www.mars.dti.ne.jp/~torao/program/cpp/overload.html
お礼
回答ありがとうございます。 C++でしたらそうしたのですが・・・ C言語なのでNo1の方の方法を取りたいと思います。
- Mizyu
- ベストアンサー率41% (245/593)
void CalA(int x,int y,int z = 0) こんな形でOKです。
お礼
回答ありがとうございます。 試してみたらうまくいきました。 常識がないのでお教え願いたいのですが、 char型の場合は void CalA(int x,int y,char *z='') こんな感じでよろしいのですか? よろしくお願いします。
お礼
たびたびありがとうございます。 解決できました。