что означает этот код? - PullRequest
       15

что означает этот код?

0 голосов
/ 25 августа 2009

это некоторый код, который требуется 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;
}

Ответы [ 7 ]

9 голосов
/ 25 августа 2009

#pragma - это директива для компилятора. В этом случае он просит компилятор поместить «комментарий» в конечный объектный файл, и этот комментарий затем используется компоновщиком для связи с библиотекой.

Затем он инициализирует библиотеку SDL.

Затем регистрируется функция SDL_Quit, которая будет выполнена при выходе из программы.

Затем сделайте паузу, иначе программа закроется немедленно.

7 голосов
/ 25 августа 2009

Краткое объяснение: Эти строки:

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

говорят «Если я работаю на Windows, скажите компоновщику связываться с библиотеками SDL.»

Немного предыстории : Когда вы компилируете C-программу, она может быть еще не завершена. Другие части окончательной программы могут понадобиться откуда-то еще - в вашем случае, из библиотек SDL.

Компоновщик - это часть программного обеспечения, которая объединяет ваш код с этими другими библиотеками для создания готовой программы. Директива #pragma comment(lib, ...) - это один из способов сообщить компоновщику, какие другие библиотеки нужны вашему коду для того, чтобы стать законченной программой.

2 голосов
/ 25 августа 2009

Этот код:

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

Прагма comment определена в на странице MSDN . Аргумент lib означает в основном то же самое, что и указание динамически связываться с указанной библиотекой:

Lib

Помещает запись поиска библиотеки в объектный файл. Этот тип комментария должен сопровождаться комментарием параметр, содержащий имя (и возможно путь) библиотеки, которая Вы хотите, чтобы компоновщик поиска. имя библиотеки следует по умолчанию поиск библиотеки записей в объекте файл; компоновщик ищет это библиотека так же, как если бы вы назвали его на командная строка при условии, что библиотека не указана с / nodefaultlib. Вы можете разместить несколько библиотеки поиска записей в том же исходный файл; каждая запись появляется в объектный файл в том же порядке в который встречается в источнике файл.

Если порядок библиотеки по умолчанию и добавленной библиотеки важно, компилируя с / Zl Переключатель предотвратит дефолт имя библиотеки от размещения в объектный модуль. Второй комментарий прагма затем можно использовать для вставки имени библиотека по умолчанию после добавления библиотека. Библиотеки, перечисленные с эти прагмы появятся в объектный модуль в том же порядке они находятся в исходном коде.

2 голосов
/ 25 августа 2009
#pragma comment(lib, "SDL.lib")

Это заставляет компоновщик искать библиотеку SDL.lib при компоновке. Второй #pragma comment делает то же самое для SDLmain.lib.

0 голосов
/ 10 сентября 2009

Прагма уже объяснена.

«использование пространства имен std» означает, что компилятор ищет определенные стандартные функции в библиотеке времени выполнения (cout, например, на самом деле будет std :: cout). Фон в том, что вы можете группировать символы в пространствах имен, которые затем являются префиксом символа. Это позволяет вам использовать идентичные символы (например, имена функций), помещая их в разные пространства имен. Директива using namespace означает автоматическое добавление префиксов к символам с указанным пространством имен. Теперь, если у вас есть собственная функция cout из пространства имен «mystuff», вы можете отличить ее от стандартной, написав «mystuff :: cout».

Вызов SDL инициализирует видео и аудио подсистемы (например, проверяет, доступны ли видео и аудио устройства и поддерживают ли они все функции, которые нужны SDL).

«atexit (SDL_Quit)» означает, что функция «SDL_Quit» будет автоматически вызываться при завершении вашей программы.

system («пауза») останавливает вашу программу и ожидает нажатия клавиши.

0 голосов
/ 25 августа 2009

Код выше main устанавливает директивы препроцессора. Из описания MS в (http://msdn.microsoft.com/en-us/library/7f0aews7%28VS.80%29.aspx): "

Помещает запись поиска библиотеки в объектный файл. Этот тип комментария должен сопровождаться параметром commentstring, содержащим имя (и, возможно, путь) библиотеки, которую вы хотите, чтобы компоновщик искал. Имя библиотеки следует за записями поиска по умолчанию в объектном файле; компоновщик ищет эту библиотеку так же, как если бы вы назвали ее в командной строке, при условии, что библиотека не указана с помощью / nodefaultlib. Вы можете разместить несколько записей поиска библиотеки в одном и том же исходном файле; каждая запись появляется в объектном файле в том же порядке, в котором она встречается в исходном файле. Если важен порядок использования библиотеки по умолчанию и добавленной библиотеки, компиляция с параметром / Zl предотвратит размещение имени библиотеки по умолчанию в объектном модуле. Затем можно использовать прагму второго комментария для вставки имени библиотеки по умолчанию после добавленной библиотеки. Библиотеки, перечисленные с этими прагмами, появятся в объектном модуле в том же порядке, в котором они находятся в исходном коде. "
0 голосов
/ 25 августа 2009

добавление к тому, что упомянул Стеффано ...

В основном код проверяет, доступна ли библиотека SDL и может ли она инициализироваться. Если нет, вы получите сообщение. Если он инициализируется, он очищает инициализацию через atexit ().

...