[PukiWiki]
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)とmain()ってどう違うんですか???

>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 words

C++

リロード   新規 編集 差分   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Sun, 07 Sep 2003 03:38:25 JST (6186d)
Link: C++(6174d)

Modified by kotakechin

"PukiWiki" 1.3.5 Copyright © 2001,2002,2003 PukiWiki Developers Team. License is GNU/GPL.
Based on "PukiWiki" 1.3 by sng
Powered by PHP 5.2.17

HTML convert time to 0.017 sec.