0

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

// 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;
}
4

7 に答える 7

9

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

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

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

そうしないと、プログラムはすぐに終了します。

于 2009-08-24T20:35:06.577 に答える
7

簡単な説明:これらの行:

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

「Windows でビルドしている場合は、リンカに SDL ライブラリとリンクするように指示してください」と言っています。

いくつかの背景: C プログラムをコンパイルするとき、それはまだ完了していない可能性があります。最終的なプログラムの他の部分は、別の場所 (あなたの場合は SDL ライブラリ) から取得する必要があるかもしれません。

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

于 2009-08-24T20:41:00.150 に答える
2
#pragma comment(lib, "SDL.lib")

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

于 2009-08-24T20:40:00.950 に答える
2

このコード:

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

commentプラグマは MSDN ページで定義されています。引数は、lib指定したライブラリに動的にリンクするように指定することと基本的に同じことを意味します。

ライブラリ

ライブラリー検索レコードをオブジェクト・ファイルに入れます。このコメント タイプには、リンカーで検索するライブラリの名前 (および場合によってはパス) を含むコメント文字列パラメーターを指定する必要があります。ライブラリー名は、オブジェクト・ファイル内のデフォルトのライブラリー検索レコードに従います。ライブラリが /nodefaultlib で指定されていない場合、リンカは、コマンド ラインで指定した場合と同様に、このライブラリを検索します。複数のライブラリー検索レコードを同じソース・ファイルに入れることができます。各レコードは、ソース ファイルで検出されたのと同じ順序でオブジェクト ファイルに表示されます。

既定のライブラリと追加されたライブラリの順序が重要な場合、/Zl スイッチを使用してコンパイルすると、既定のライブラリ名がオブジェクト モジュールに配置されなくなります。次に、2 番目のコメント プラグマを使用して、追加されたライブラリの後にデフォルト ライブラリの名前を挿入できます。これらのプラグマでリストされたライブラリは、ソース コードにあるのと同じ順序でオブジェクト モジュールに表示されます。

于 2009-08-24T20:41:03.817 に答える
0

プラグマについてはすでに説明しました。

「名前空間 std を使用する」とは、コンパイラが実行時ライブラリ内の特定の標準関数を検索することを意味します (cout は、実際には std::cout になります)。背景は、シンボルのプレフィックスである名前空間でシンボルをグループ化できることです。これにより、異なる名前空間に配置することで、同一のシンボル (関数名など) を使用できます。"using namespace" ディレクティブは、指定された名前空間をシンボルに自動的にプレフィックスすることを意味します。名前空間「mystuff」から独自の cout 関数がある場合は、「mystuff::cout」と書くことで標準のものと区別できます。

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

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

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

于 2009-09-10T11:19:15.033 に答える
0

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

ライブラリー検索レコードをオブジェクト・ファイルに入れます。このコメント タイプには、リンカーで検索するライブラリの名前 (および場合によってはパス) を含むコメント文字列パラメーターを指定する必要があります。ライブラリー名は、オブジェクト・ファイル内のデフォルトのライブラリー検索レコードに従います。ライブラリが /nodefaultlib で指定されていない場合、リンカーは、コマンド ラインで名前を指定したかのように、このライブラリを検索します。複数のライブラリー検索レコードを同じソース・ファイルに入れることができます。各レコードは、ソース ファイルで検出されたのと同じ順序でオブジェクト ファイルに表示されます。既定のライブラリと追加されたライブラリの順序が重要な場合、/Zl スイッチを使用してコンパイルすると、既定のライブラリ名がオブジェクト モジュールに配置されなくなります。次に、2 番目のコメント プラグマを使用して、追加されたライブラリの後にデフォルト ライブラリの名前を挿入できます。これらのプラグマでリストされたライブラリは、ソース コードにあるのと同じ順序でオブジェクト モジュールに表示されます。」
于 2009-08-24T20:46:15.023 に答える
0

ステファノが言及したことに加えて...

基本的に、コードは SDL ライブラリが利用可能で初期化できるかどうかをチェックしています。そうでない場合は、メッセージが表示されます。初期化する場合は、atexit() によって初期化をクリアします。

于 2009-08-24T20:41:17.483 に答える