- ベストアンサー
c言語 引数のvoidについて
/*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です。 よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか? 長いので規格を引用するのはやめますが、二つの関数型が適合するための条件を満たしているからです。JIS X3010:2003 6.7.5.3 関数宣言子(関数原型を含む)を参照してください。p89~p90にかけての記述がこれに該当します。
その他の回答 (3)
- ddnp009
- ベストアンサー率25% (15/58)
Cの場合、引数の型チェックをしない。 C++の場合、voidが省略されたとみなす。 たしかこんなだったはず。何かで見たな。夢か。
お礼
ご回答有り難うございました。
- ryusei2
- ベストアンサー率24% (45/184)
Delphiが専門で、Cはあまり詳しくなく、不正確かも知れませんが参考までに。 Borland C++ 5.5.1で試してみましたが、 void f(int i); void f(){ } は正常にコンパイルできて、 void f(int i); void f(void){} は当然ですが、エラーになりました。 Delphiも同様です。 単に一度入力したものを再度入力するのは、あまり意味がなく手間がかかるためため、省略できるのではないでしょうか。
お礼
ご回答有り難うございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
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(); は違う. ちょっとややっこしい?
お礼
ご回答有り難うございました。
お礼
参考にさせていただき、無事解決いたしました。 有り難うございました。