2013/01/26

[C++]エントリーポイントを変える

,
 mainをメンバ関数にどうやったらできるだろうかと考えてました… 
例えば、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)

0 コメント to “[C++]エントリーポイントを変える”

コメントを投稿