週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

main関数にプロトタイプ宣言をするという話にかこつけて、C++のmain関数の話をします。 しかしよく覚えていないのでC++ 3.6.1 Main Functionをざらざらとチェック。ところでこれは正しいspecificationなんでしょうか。よく知りません。

意味のわからない文章を発見。英語は難しいです。

It shall have a return type of type int, but otherwise its type is implementation-defined.
このotherwiseってどういう意味なんでしょう。

わかったことは次のとおりです。

  • main関数をプログラム中で使用してはいけない。
  • main関数をstatic やinlineで宣言してはいけない。
  • mainという名前はmain関数と衝突しない限りにおいては使える。(この記述はどこまで可能なのかよくわかりません)
  • main関数はオーバーロードできない。
  • main関数がreturnなしに終了したら、return 0;されたのと同じことがおきる。

私の使うコンパイラでは、main関数が変な引数を受け取ったり、mainが再帰したりするのはかまわないです。 正確に言うと、少なくともgcc3.4.4とvcの最近のバージョンでは。 ゴルフから得られた貴重な知見です。しかしもともとはiocccのコードからかもしれません。 ということはつまり、ゴルファーやioccc参加者はmainとして奇妙な型の関数を宣言することがあるため、プロトタイプ宣言をすることによってmainの型を明示することが望ましいといえます。

一方、mainをオーバーロードするのは普通にだめです。gcc3.4.4では次の警告が出ました。

% cat iya.cc
#include <iostream>
int main(void) {std::cout << "humu";}
int main(int c, char** v) {std::cout << "hoge";}
% g++ iya.cc
iya.cc: In function `int main(int, char**)':
iya.cc:3: error: declaration of C function `int main(int, char**)' conflicts with
iya.cc:2: error: previous declaration `int main()' here
%
一方VCでは次のとおり。
>type iya.cpp
#include <iostream>
int main(void) {std::cout << "humu";}
int main(int c, char** v) {std::cout << "hoge";}

>cl /EHsc /Ox /W3 iya.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

iya.cpp
iya.cpp(3) : error C2731: 'main' : 関数はオーバーロードできません。
        iya.cpp(3) : 'main' の宣言を確認してください。

>
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/213-d67bc44e
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。