![]() |
main | |
http://get.whitesnow.jp/knowwiki/index.php?%5B%5Bmain%5D%5D |
最新の20件2014-07-292014-07-252006-11-272004-02-192003-10-302003-09-192003-09-182003-09-07 |
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200211_02110028.html
>void main (void) は,ISO C/C++(ANSI C/C++)に準拠したプログラムを意地でも書きたくない場合に使います。 ISO C(ISO/IEC 9899:1999)とISO C++(ISO/IEC 14882:1998)を読んでみると, int main (void) { /* ... */ } と int main (int argc, char * argv[]) { /* ... */ } のどちらかの形式のみが準拠であり,他の形式は実装定義となります。 #つまり,コンパイラが異なれば動作が異なる。 ちなみに,同じ意味であれば仮引数の名前が変わったり,char **argvだったりしても問題ないです。 ref) ISO/IEC 9899:1999 5.1.2.2.1 Program startup ref) ISO/IEC 14882:1998 3.6.1 Main function で, >main () は,C89(ISO/IEC 9899:1990)では int main (...) ですから,厳密には実装定義です。ただし,通常は int main (void) の形式として処理されて問題は起きないでしょう。 C99(ISO/IEC 9899:1999)/C++では >main () は,type-specifierが含まれないので構文エラーとなります。 ref) ISO/IEC 9899:1999 6.7.2 Type specifiers ref) ISO/IEC 14882:1998 7.1.5 Type sepcifiers 結論を言うと,どちらもだめで, int main (void) を使う必要があります。 Cにおいて,仮引数リストが空欄であることと,単一の宣言voidであることは, 意味合いが異なります。 以下,非常に突っ込んだ話になります。 初心者であることを自称する方は飛ばした方がよいでしょう。 まず,「プログラミング言語C 第2版」より関連する構文を列挙します。 declarator: pointer(opt) direct-declarator
direct-declarator: identifier direct-declarator '(' parameter-type-list ')' direct-declarator '(' identifier-list(opt) ')'
parameter-type-list: parameter-list parameter-list ',' '...'
parameter-list: parameter-declaration parameter-declaration ',' parameter-list
parameter-declaration: declaration-specifiers declarator declaration-specifiers abstract-declarator(opt)
identifer-list: identifer identifer-list ',' identifier
#抜粋終わり。 つまり, func() は, declarator: func() direct-declarator[1] direct-declarator[1]: func() direct-declarator[2] '(' identifier-list(opt)[1] ') direct-declarator[2]: func identifier[1] identifer[1]: func identifier-list[1]: (empty) として処理されます。それに対して, func (void) は, declarator: func(void) direct-declarator[3] direct-declarator[3]: func(void) direct-declarator[4] '(' parameter-type-list[1] ')' direct-declarator[4]: func identifier[2] identifer[2]: func parameter-type-list[1]: void parameter-list[1] parameter-list[1]: void parameter-declaration[1] parameter-declaration[1]: void declaration-specifiers[1] abstract-declarator(opt)[1] declaration-specifiers[1]: void abstract-declarator[1]: (empty) として処理されます。 ここで,関数呼び出し規則で,identifier-listを持つ関数に関しては, 仮引数と実引数の数が一致しない場合は単に「不定」となっています。 つまり, void func (); に対してfunc(10);は,不定ではあるけれど呼び出し自体は有効です。 それに対し,parameter-type-listを持つ関数に関しては, , ...で終わる関数を除いて仮引数と実引数の数(と型)を一致させなければいけません。 つまり, void func (void); に対してfunc(10);は構文エラーとなります。 #単一のparameter-type-list:voidを持つ場合についての特例でvoidのみの場合はひとつも持てない。 このあたりはC99になっても変わっていません。 C++では,identifer-listが許されないので,構文が少し変わっています。 で,parameter-type-listを空にすることが許され,それは単一のvoidと等しいということになっています。 #正確に書くとparameter-type-listではなくparameter-declaration-clauseが空の場合。 related wordsC++ |