プロが教える店舗&オフィスのセキュリティ対策術

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

VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか?
よろしくお願いします。

教えて!goo グレード

A 回答 (5件)

#1です



> char型の場合は
> void CalA(int x,int y,char *z='')

それでOKです。

ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。
危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。
ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/12 14:43

Cでは'不可能'です。


C++なら簡単ですが。

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

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

お礼日時:2002/11/12 13:45

お使いになるのが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 ); /* 可変個の引数のリセット */

}

という感じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/12 13:38

可能です。


オーバーロードを使用します。

ここを参考にしてください。
http://www.mars.dti.ne.jp/~torao/program/cpp/ove …

参考URL:http://www.mars.dti.ne.jp/~torao/program/cpp/ove …
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/12 13:39

void CalA(int x,int y,int z = 0)



こんな形でOKです。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
試してみたらうまくいきました。

常識がないのでお教え願いたいのですが、
char型の場合は
void CalA(int x,int y,char *z='')
こんな感じでよろしいのですか?
よろしくお願いします。

お礼日時:2002/11/12 13:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング