2011-01-29 3 views
13

メインでマクロを作成しており、コンパイル時に/ SUBSYSTEM:WINDOWSまたは/ SUBSYSTEM:CONSOLEで選択したサブシステムをチェックする必要があります。メイン機能。これを達成するために私が確認できる#defineがありますか?サブシステムに関連する#defineがあります

+0

メイン関数を生成するべきではありません。なぜなら、それを生成することは自分自身にとって無益であり、他の人には妨げになるからです。私。それには負の効用があります。しかし、もしあなたが 'main'関数を生成するのが好きなら、標準の' main' *を生成してください。それはビルドのサブシステムに関係なくうまく動作します。注意:MFCアプリケーションをやっているのでなければ、この部門で少し挑戦しているMicrosoftツールでは、リンカオプション '/ entry:mainCRTStartup'を設定します。この場合、あなたは他人(つまりMicrosoft) 'main'を引き継ぐのと同じ本当に悪いアイディアを持っていた。 –

答えて

4

ライブラリのユーザー(またはそれが何であれ)を簡単にする場合は、マクロからWinMainmainの両方を生成できます。デフォルトではリンカはコンソールアプリケーションをmainから開始し、win32アプリケーションはWinMainから開始するように設定します。他の "main"関数は無視されます。

は、(それが両方で動作するようにだ場合はおそらく、コードの残りの部分は、メイン関数の引数(argcargvhInstance、など)のいずれかを使用しません。)

_CONSOLEを定義し使用することができただし、自動的には表示されません。手動でプロジェクトのプロパティに追加する必要があります。一方、起動シンボルの選択は自動的に行われます。プロジェクトの作成者は何も設定する必要はなく、実際に行う必要はなく、ウィンドウからコンソールアプリケーション(場合によってはコンフィグレーションごとに)に切り替えることができるため、リンカーが選択するだけで、両方の機能を提供するだけで作業が楽になるかもしれません何でも

11

_CONSOLEあなたのためのトリックを行う必要があります。
実際にこのルートに移動する場合は、#pragma comment(linker, "/subsystem:windows")または​​を使用してサブシステムを選択することもできます。

+2

これは間違いなく、システムを手動で指定するという対話とリンカが決定する(またはプロジェクト設定を変更する)という、元の質問に直接答えるので、より良い答えです。 –

+0

どのように '_CONSOLE'が定義されますか? – jww

3

これは実際の動作ではありません。あなたは、コンソールアプリケーションとネイティブWindowsアプリケーションとで劇的に異なるコードを書く必要があります。コンソールアプリケーションでは、printfまたはcoutを使用して出力を生成しますが、マウスの場合はあまり使用しません。ネイティブのWindowsアプリケーションでは、メッセージループが必要で、WM_PAINTメッセージを検出してウィンドウを更新するウィンドウプロシージャを持つウィンドウを作成する必要があります。 Etcetera。

しかし、両方を行うコードを書くことができます。 main()とWinMain()関数の両方を書くだけで、CRTは自動的に正しいものを呼び出します。

+0

+1:両方の機能を書いています。 – Puppy

+1

あなたが作ったステートメントは真実ですが、それらはすべての話を伝えません。コンソールサブシステムの有無にかかわらず機能するアプリケーションを、いくつかの小さなtweeksを使って書くことが可能です。通常、これはウィンドウレスアプリケーション(または単にMessageBoxを呼び出すことがあります)であり、UIスレッドを持ちません。標準のパイプはコンソール以外のアプリケーションでも利用できますが、リダイレクトされない限り出力は見られません。 – Tergiver

+2

確かに。すべての私のアプリケーションはデバッグビルドのコンソールアプリケーションであり、基本的に6行の余分なコードがあります: 'WinMain(0,0,0,0)を返す '、すべてが' #ifdef _CONSOLE'の中にあるmain関数です。あなたは本当に '#ifdef'を必要としません。 –

関連する問題