• ベストアンサー

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です。 よろしくおねがいします。

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか? 長いので規格を引用するのはやめますが、二つの関数型が適合するための条件を満たしているからです。JIS X3010:2003 6.7.5.3 関数宣言子(関数原型を含む)を参照してください。p89~p90にかけての記述がこれに該当します。

s5210
質問者

お礼

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

その他の回答 (3)

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.4

Cの場合、引数の型チェックをしない。 C++の場合、voidが省略されたとみなす。 たしかこんなだったはず。何かで見たな。夢か。

s5210
質問者

お礼

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

  • ryusei2
  • ベストアンサー率24% (45/184)
回答No.2

Delphiが専門で、Cはあまり詳しくなく、不正確かも知れませんが参考までに。 Borland C++ 5.5.1で試してみましたが、 void f(int i); void f(){ } は正常にコンパイルできて、 void f(int i); void f(void){} は当然ですが、エラーになりました。 Delphiも同様です。 単に一度入力したものを再度入力するのは、あまり意味がなく手間がかかるためため、省略できるのではないでしょうか。

s5210
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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(); は違う. ちょっとややっこしい?

s5210
質問者

お礼

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

関連するQ&A