2009-08-24 101 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”。

系统(“暂停”)暂停您的程序并等待按键。