2009-08-24 118 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 2009-08-24 20:36:23

+0

他的第一句話是主要以上的代碼在做什麼。 – 2009-08-24 20:38:34

+1

@Fuzz,Lance,關於它是否適用於main或main本身之上的代碼,評論並不清楚。 Fuzz,我建議你編輯你的問題來澄清。 – 2009-08-24 20:40:28

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

這會導致鏈接程序在鏈接時搜索庫SDL.lib。第二個#pragma comment對SDLmain.lib也是這樣。

7

快速的解釋:這些行:

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

都在說「如果我正在基於Windows,告訴鏈接與SDL庫鏈接。」

一些背景:當你編譯你的C程序時,它可能還沒有完成。最終程序的其他部分可能需要來自其他地方 - 您的情況,來自SDL庫。

鏈接器是一種軟件,它將您的代碼與其他庫結合起來生成完成的程序。 #pragma comment(lib, ...)指令是告訴鏈接器您的代碼需要哪些其他庫才能成爲完整程序的方式之一。

2

此代碼:

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

comment編譯指示在the MSDN page定義。該lib參數基本上意味着同樣的事情,指定動態鏈接到指定庫:

LIB

地方庫搜索記錄的對象文件英寸此註釋類型 必須附帶包含名稱(和 可能是路徑)的註釋串 參數, 您希望鏈接器搜索該庫。 庫名稱遵循對象 文件中的默認 庫搜索記錄;鏈接器將搜索此庫,就像您命名爲 的命令行一樣,前提是 庫不是用 /nodefaultlib指定的。您可以將多個 庫搜索記錄放在同一個 源文件中;每個記錄在 文件中遇到的 中的相同順序出現在 目標文件中。

如果默認庫和一個附加的庫的順序是 重要,與/ ZL 開關編譯將防止默認 庫名從被放置在所述對象 模塊中。然後可以使用第二個註釋編譯器 在添加的 庫之後插入缺省庫的名稱 庫。與 一起列出的這些編譯指示將以 可在源代碼中找到的相同順序顯示在 目標模塊中。

0

添加到什麼Steffano提到...

基本上,代碼檢查,看是否SDL LIB可用並且能初始化。如果沒有,你會得到消息。如果它初始化,它通過atexit()清除初始化。

0

上面的主要代碼是設置預處理器指令。 (http://msdn.microsoft.com/en-us/library/7f0aews7%28VS.80%29.aspx):「

在目標文件中放置一個庫搜索記錄,該註釋類型必須附帶一個包含您想要的庫的名稱(可能還有路徑)的commentstring參數鏈接器要進行搜索庫名稱遵循目標文件中的缺省庫搜索記錄;鏈接器搜索此庫,就好像您已在命令行上命名該庫一樣,前提是庫沒有用/ nodefaultlib指定。將多個庫搜索記錄放在同一個源文件中;每個記錄以與源文件中遇到的順序相同的順序出現在目標文件中 如果默認庫和添加的庫的順序很重要,使用/ Zl開關將防止默認庫nam e被放置在目標模塊中。然後可以使用第二個註釋編譯指令在添加的庫之後插入默認庫的名稱。與這些編譯列出的庫將出現在相同的順序對象模塊中它們在源代碼中發現的。」
0

的編譯的東西已經被解釋。

‘使用命名空間std’意味着編譯器在運行時庫中搜索某些標準函數(例如,cout實際上是std :: cout)。背景是,你可以在命名空間中對符號進行分組,這就是符號的前綴,這允許你使用相同的符號名稱空間),「using namespace」指令自動爲指定的名稱空間前綴符號,現在如果你有一個名字空間「mystuff」你自己的cout函數,你可以通過編寫「的MyStuff ::法院」。

SDL呼叫初始化視頻和音頻子系統(例如查看是否有可用的視頻和音頻設備以及它們是否支持SDL需要的所有功能)。

「atexit(SDL_Quit)」表示在程序終止時將自動調用函數「SDL_Quit」。

系統(「暫停」)暫停您的程序並等待按鍵。