2009-08-24 10 views
0

これは、シンプルなプログラムを動作させるために、SDLがVisual Studio 2005で必要とするコードです。コードは何をしていますか?私のインストラクターが私にそれを置くようにと言ったので、私がそれを持っている唯一の理由はそれを説明したことはありません。このコードは何を意味しますか?

// what is this code doing? 
//--------------------------------------------------------- 
#ifdef WIN32 
#pragma comment(lib, "SDL.lib") 
#pragma comment(lib, "SDLmain.lib") 
#endif 
//------------------------------------------------------- 
#include <iostream> 
#include "SDL.h" 
using namespace std; 

int main(int argc, char *argv[]) 
{  
    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1) { 
     cerr << "Failed to initialize SDL: " << SDL_GetError() << endl; 
     exit(1); 
    } 
    atexit(SDL_Quit); 

    system("pause"); 
    return 0; 
} 

答えて

9

#pragmaは、コンパイラへの指示です。この場合、最終的なオブジェクトファイルに "コメント"を入れるようにコンパイラに依頼し、このコメントはリンカーによってライブラリとリンクするために使用されます。

次に、SDLライブラリを初期化します。

次に、プログラム終了時に実行されるSDL_Quit関数を登録します。

一時停止します。そうしないと、プログラムは直ちに終了します。

+0

私は上記のコードについて話しています – TheFuzz

+0

彼の最初の文はメインのコードが何をしているかです。 –

+1

@Fuzz、Lance、コメントは、メインまたはメイン本体の上にあるコードに適用されるかどうか不明でした。 Fuzz、あなたの質問を編集してそのことを明確にすることをお勧めします。 –

2
#pragma comment(lib, "SDL.lib") 

これにより、リンク中にリンカーはライブラリSDL.libを検索します。 2番目の#pragma commentは、SDLmain.libでも同じです。

7

クイック説明:これらの行:「私は、Windows上で構築されていた場合は、SDLライブラリとリンクするリンカを教えてくれ。」

#ifdef WIN32 
#pragma comment(lib, "SDL.lib") 
#pragma comment(lib, "SDLmain.lib") 
#endif 

を言っています

背景::Cプログラムをコンパイルすると、まだ完成していない可能性があります。あなたのケースでは、SDLライブラリから、最終的なプログラムの他の部分が他の場所から来る必要があるかもしれません。

リンカーは、コードを他のライブラリと組み合わせて完成したプログラムを作成するソフトウェアです。 #pragma comment(lib, ...)ディレクティブは、完全なプログラムになるためにコードが必要とする他のライブラリをリンカに伝える方法の1つです。

2

このコード:

#ifdef WIN32 
#pragma comment(lib, "SDL.lib") 
#pragma comment(lib, "SDLmain.lib") 
#endif 

commentプラグマはthe MSDN pageに定義されています。オブジェクト・ファイル内の

libの場所ライブラリ - 検索レコードを: lib引数は、基本的には動的に指定されたライブラリにリンクするために指定するのと同じことを意味します。このコメントタイプ には、 というコメント文字が付いていて、リンカーで検索するライブラリの名前が であるライブラリの名前(および可能であれば、パスは )が含まれている必要があります。 ライブラリ名は、オブジェクト ファイル内のデフォルトの ライブラリ検索レコードに従います。リンカーは ライブラリを に指定したのとまったく同じように、 ライブラリが /nodefaultlibで指定されていないことを条件にコマンドラインを検索します。同じ ソースファイルに複数の のライブラリ検索レコードを配置することができます。各レコードは、 ファイル内で、 ファイル内で遭遇した に同じ順序でオブジェクトファイルに表示されます。

デフォルトのライブラリと追加ライブラリの順序が 重要な場合は、/ Z1の スイッチを使用してコンパイルすると オブジェクトモジュールに配置されることから、デフォルト ライブラリ名を防ぐことができます。 2番目のコメントプラグマ は、 ライブラリの後にデフォルトライブラリの の名前を挿入するために使用できます。 でリストされたライブラリは、 オブジェクトモジュールに、 ソースコード内に同じ順序で表示されます。 Steffanoが言及したものに追加しています...

0

基本的に、コードはSDL libには利用可能と初期化することができますかどうかを確認するためにチェックしています。そうでなければ、メッセージを受け取る。それが初期化された場合、atexit()を介して初期化をクリアします。

0

上記のコードはプリプロセッサディレクティブの設定です。 MSの説明(http://msdn.microsoft.com/en-us/library/7f0aews7%28VS.80%29.aspx)から: "

オブジェクトファイルにライブラリ検索レコードを配置します。このコメントタイプには、必要なライブラリの名前(場合によってはパス)を含むcommentstringパラメータを付ける必要がありますライブラリ名は、オブジェクトファイル内のデフォルトのライブラリ検索レコードの後に​​置かれます。リンカは、/ nodefaultlibでライブラリが指定されていない場合、コマンドラインでこのライブラリを検索します。複数のライブラリ検索レコードを同じソースファイルに配置する;各レコードは、ソースファイル内で見つかった順序と同じ順序でオブジェクトファイルに表示される デフォルトライブラリと追加されたライブラリの順序が重要な場合は、/ZLスイッチを使用すると、デフォルトのライブラリ名eがオブジェクトモジュールに配置されないようにします。 2番目のコメントプラグマを使用して、追加されたライブラリの後にデフォルトライブラリの名前を挿入できます。これらのプラグマにリストされているライブラリは、それらがソースコード内で発見されたのと同じ順序でオブジェクトモジュールに表示されます。」
0

プラグマのものは、既に説明した。

『名前空間stdを使用して、』コンパイラことを意味ランタイムライブラリの特定の標準関数を検索します(実際にはstd :: coutになります)。背景は、シンボルの接頭辞である名前空間にシンボルをグループ化できるということです。 "名前空間を使用する"指示は、指定された名前空間にシンボルを自動的に接頭辞付けることを意味します。名前空間 "mystuff"からあなた自身のcout関数を持っていれば、それを標準のものと区別することができます"mystuff :: cout"

SDLコールは、ビデオおよびオーディオサブシステムを初期化します(たとえば、使用可能なビデオおよびオーディオデバイスがあるかどうか、SDLが必要とするすべての機能をサポートしているかどうかなど)。

"atexit(SDL_Quit)"は、プログラムが終了すると自動的に関数 "SDL_Quit"が呼び出されることを意味します。

システム(「一時停止」)は、プログラムを停止し、キーを押すのを待ちます。

関連する問題