例えば、Visual Studioで作ったWindowsコンソールアプリケーション(/SUBSYSTEM:CONSOLE)の場合、デフォルトだとmainCRTStartupという関数が呼び出されます。まあmain()ですね、無いとリンカに怒られてしまいます…
で、今度はクラスのメンバ関数にmainを含めたいのですが、
#include <iostream> #include <vector> #include <string> class mainEntry{ public: static int main(); }; int mainEntry::main(){ std::cout << "main" << std::endl; return 0; }と書いても、
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
1>************\Visual Studio 2008\Projects\Console3\Debug\Console3.exe : fatal error LNK1120: 外部参照 1 が未解決です。
とコンパイル時にエラーが出てしまいます。ふむ、エントリーポイントをmainEntry::main()に変えれば良さそうですね。エントリーポイントを変えるには、Visual Studioの場合、[プロジェクト]→[プロパティ]→[構成プロパティ]→[リンカ]→[詳細]で[エントリーポイント]に関数名を記入します。
こうすると、ちゃんとリンクできて、一応動作します。
ただ、自分でエントリーポイントを変更した場合のデメリットは
"エントリ ポイントの設定は、リンカーに任せることをお勧めします。このようにすると、C のランタイム ライブラリが正確に初期化され、静的オブジェクト用の C++ のコンストラクターが実行されます。"(from /ENTRY (エントリ ポイント シンボル))
ということを自分でやらないといけない(?)こととかでしょうか…
因みに、C99だとエントリーポイントについては次のように規格書に記されているみたいです。
"5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be de 甁ed with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;
9)
or in some other implementation-de 甁ed manner."(from http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf)