プロが教えるわが家の防犯対策術!

/*sample01.c*/
void f(void);
void f(void){
}

/*sample02.c*/
void f(void);
void f(){
}

sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか?
コンパイラはDev-C++ Version4.9.9.2
OSはWindowsXPです。
よろしくおねがいします。

A 回答 (4件)

> sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか?



長いので規格を引用するのはやめますが、二つの関数型が適合するための条件を満たしているからです。JIS X3010:2003 6.7.5.3 関数宣言子(関数原型を含む)を参照してください。p89~p90にかけての記述がこれに該当します。
    • good
    • 0
この回答へのお礼

参考にさせていただき、無事解決いたしました。
有り難うございました。

お礼日時:2006/11/14 17:00

Cの場合、引数の型チェックをしない。


C++の場合、voidが省略されたとみなす。

たしかこんなだったはず。何かで見たな。夢か。
    • good
    • 0
この回答へのお礼

ご回答有り難うございました。

お礼日時:2006/11/14 16:59

Delphiが専門で、Cはあまり詳しくなく、不正確かも知れませんが参考までに。



Borland C++ 5.5.1で試してみましたが、

void f(int i);
void f(){ }
は正常にコンパイルできて、

void f(int i);
void f(void){}
は当然ですが、エラーになりました。

Delphiも同様です。

単に一度入力したものを再度入力するのは、あまり意味がなく手間がかかるためため、省略できるのではないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答有り難うございました。

お礼日時:2006/11/14 17:01

ISO/IEC 9899:1999 の 6.7.5.3 Function declarators (including prototypes), paragraph 14 に


An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.
とあるので, 「関数定義において引数リストを空にするとその関数は引数を持たないものとする」ということになるんじゃないかなぁ? つまり
void f(void) { ... } と void f() { ... } は同じ.
一方, void f(void); と void f(); は違う.
ちょっとややっこしい?
    • good
    • 0
この回答へのお礼

ご回答有り難うございました。

お礼日時:2006/11/14 17:02

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