这是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;
}
答案 0 :(得分:9)
#pragma
是编译器的指令。在这种情况下,它要求编译器将“注释”放入最终目标文件中,然后链接器使用此注释链接库。
然后初始化SDL库。
然后它注册要在程序退出时执行的SDL_Quit函数。
然后暂停,否则程序立即退出。
答案 1 :(得分:7)
快速解释:这些行:
#ifdef WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif
正在说“如果我是在Windows上构建的,请告诉链接器链接到SDL库。”
某些背景:编译C程序时,它可能尚未完成。最终程序的其他部分可能需要来自其他地方 - 在您的情况下,来自SDL库。
链接器是一个软件,它将您的代码与其他库相结合,以生成完成的程序。 #pragma comment(lib, ...)
指令是告诉链接器您的代码需要哪些其他库才能成为完整程序的方法之一。
答案 2 :(得分:2)
#pragma comment(lib, "SDL.lib")
这会导致链接器在链接时搜索库SDL.lib。第二个#pragma comment
对SDLmain.lib执行相同的操作。
答案 3 :(得分:2)
此代码:
#ifdef WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif
comment
pragma在the MSDN page中定义。 lib
参数与指定动态链接到指定库的方式基本相同:
LIB
将库搜索记录放在目标文件中。此评论类型 必须附有评论字符串 包含名称的参数(和 可能是图书馆的路径) 您希望链接器进行搜索。该 库名称遵循默认值 库中的搜索记录 文件;链接器搜索这个 库就像你已经命名它一样 命令行提供了 未指定库 / nodefaultlib。你可以放置多个 库搜索记录在同一个 源文件;每条记录都出现在 对象文件的顺序相同 在源中遇到它 文件。
如果默认库和添加的库的顺序是 重要的是,使用/ Zl进行编译 开关将阻止默认 库名被放置在 对象模块。第二个评论pragma 然后可以用来插入名称 添加后的默认库 图书馆。列出的库 这些pragma将出现在 对象模块的顺序与它们相同 在源代码中找到。
答案 4 :(得分:0)
增加斯特凡诺提到的......
基本上,代码正在检查SDL lib是否可用并且能够初始化。如果没有,你会收到消息。如果它确实初始化,它会通过atexit()清除intiialization。
答案 5 :(得分:0)
上面的代码主要是设置预处理器指令。来自MS的(http://msdn.microsoft.com/en-us/library/7f0aews7%28VS.80%29.aspx)描述:“
将库搜索记录放在目标文件中。此注释类型必须附带一个commentstring参数,该参数包含您希望链接器搜索的库的名称(以及可能的路径)。库名称遵循目标文件中的默认库搜索记录;链接器搜索此库,就像您在命令行上命名它一样,前提是该库未使用/ nodefaultlib指定。您可以在同一源文件中放置多个库搜索记录;每条记录都以与源文件中遇到的顺序相同的顺序出现在目标文件中。 如果默认库和添加的库的顺序很重要,则使用/ Zl开关进行编译将阻止将默认库名称放置在目标模块中。然后可以使用第二个注释编译指示在添加的库之后插入默认库的名称。使用这些编译指示列出的库将按照与源代码中相同的顺序显示在对象模块中。“
答案 6 :(得分:0)
已经解释了pragma的东西。
“using namespace std”意味着编译器搜索运行时库中的某些标准函数(cout,例如实际上是std :: cout)。背景是您可以在名称空间中对符号进行分组,这些符号是符号的前缀。这允许您通过将它们放在不同的名称空间中来使用相同的符号(例如函数名称)。 “using namespace”指令意味着使用指定的命名空间自动为符号添加前缀。现在,如果你有一个名为“mystuff”的命名空间的cout函数,你可以通过编写“mystuff :: cout”将其与标准函数区分开来。
SDL呼叫初始化视频和音频子系统(例如,查看是否有可用的视频和音频设备以及它们是否支持SDL所需的所有功能)。
“atexit(SDL_Quit)”表示程序终止时将自动调用函数“SDL_Quit”。
system(“pause”)暂停你的程序并等待按键。