• ベストアンサー

C言語での引数の省略方法

お世話になります。 C言語での関数の引数の省略方法についてお聞きしたいです。 たとえば、CalA(x,y,z)という関数があるとします。 このzの部分を使用しないときは省略という風にしたいのです。 CalA("あ","い","う"); CalA("あ","い"); ↑このようにどちらにも対応したい。 VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.5

#1です > char型の場合は > void CalA(int x,int y,char *z='') それでOKです。 ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。 危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。 ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。

u_kappa
質問者

お礼

たびたびありがとうございます。 解決できました。

その他の回答 (4)

回答No.4

Cでは'不可能'です。 C++なら簡単ですが。 他の方からの回答にあるように、可変引数という テがありますが、これだと引数の型と数について なんのチェックも行なわれず、コンパイラはエラー を報告しなくなります。危険を顧みないなら十分 な留意の上お使いください。

u_kappa
質問者

お礼

回答ありがとうございます。 不可能なのですか・・・ No1のやり方でOKだと思ったのですが。 たとえば使用する際にint型の所にchar型を指定してもwarningがでなくなるということですよね?

noname#11476
noname#11476
回答No.3

お使いになるのが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 ); /* 可変個の引数のリセット */ } という感じです。

u_kappa
質問者

お礼

回答ありがとうございます。 このような方法もあるのですね。 No1の方の方法が求めているものでした。 かといってこちらの方法も知っておいて損はありませんでした。 知識が増えました。ありがとうございました。

  • mld_sakura
  • ベストアンサー率20% (264/1282)
回答No.2

可能です。 オーバーロードを使用します。 ここを参考にしてください。 http://www.mars.dti.ne.jp/~torao/program/cpp/overload.html

参考URL:
http://www.mars.dti.ne.jp/~torao/program/cpp/overload.html
u_kappa
質問者

お礼

回答ありがとうございます。 C++でしたらそうしたのですが・・・ C言語なのでNo1の方の方法を取りたいと思います。

  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

void CalA(int x,int y,int z = 0) こんな形でOKです。

u_kappa
質問者

お礼

回答ありがとうございます。 試してみたらうまくいきました。 常識がないのでお教え願いたいのですが、 char型の場合は void CalA(int x,int y,char *z='') こんな感じでよろしいのですか? よろしくお願いします。