0

这是 SDL 在 Visual Studios 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;
}
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, ...)指令是告诉链接器您的代码需要哪些其他库才能成为完整程序的方法之一。

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

这会导致链接器在链接时搜索库 SDL.lib。第二个#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 开关进行编译将阻止将默认库名称放置在目标模块中。然后可以使用第二个注释编译指示在添加的库之后插入默认库的名称。与这些 pragma 一起列出的库将按照它们在源代码中的相同顺序出现在目标模块中。

于 2009-08-24T20:41:03.817 回答
0

除了Steffano提到的......

基本上,代码会检查 SDL 库是否可用并能够初始化。如果没有,你会收到消息。如果它确实初始化了,它会通过 atexit() 清除初始化。

于 2009-08-24T20:41:17.483 回答
0

上面的代码主要是设置预处理器指令。来自 MS 在 ( http://msdn.microsoft.com/en-us/library/7f0aews7%28VS.80%29.aspx ) 的描述:“

在目标文件中放置一个库搜索记录。此注释类型必须附带一个注释字符串参数,该参数包含您希望链接器搜索的库的名称(可能还有路径)。库名称遵循目标文件中的默认库搜索记录;如果没有使用 /nodefaultlib 指定该库,则链接器将搜索此库,就像您在命令行中命名它一样。您可以将多个图书馆搜索记录放在同一个源文件中;每条记录在目标文件中的出现顺序与在源文件中出现的顺序相同。如果默认库和添加库的顺序很重要,则使用 /Zl 开关进行编译将阻止将默认库名称放置在目标模块中。然后可以使用第二个注释编译指示在添加的库之后插入默认库的名称。与这些 pragma 一起列出的库将按照它们在源代码中的相同顺序出现在目标模块中。”
于 2009-08-24T20:46:15.023 回答
0

pragma 的东西已经解释过了。

“使用命名空间std”意味着编译器在运行时库中搜索某些标准函数(例如cout 实际上是std::cout)。背景是您可以在命名空间中对符号进行分组,然后命名空间是符号的前缀。这允许您通过将它们放在不同的名称空间中来使用相同的符号(例如函数名称)。“使用命名空间”指令意味着自动为指定命名空间的符号添加前缀。现在,如果您从命名空间“mystuff”中拥有自己的 cout 函数,则可以通过编写“mystuff::cout”将其与标准函数区分开来。

SDL 调用初始化视频和音频子系统(例如,查看是否有可用的视频和音频设备以及它们是否支持 SDL 需要的所有功能)。

“atexit (SDL_Quit)” 意味着当您的程序终止时,函数“SDL_Quit”将被自动调用。

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

于 2009-09-10T11:19:15.033 回答