2015-07-17 2 views
0

я пытаюсь адаптировать конкретную Исходник--пример, но есть проблемы, чтобы понять, как он держит контроль над основным контуром:Пожалуйста, объясните это C++ макрос

// Combine some macros together to create a single macro 
// to launch a class containing a run method 
#define RUN_OVR_APP(AppClass) \ 
MAIN_DECL { \ 
if (!ovr_Initialize()) { \ 
    SAY_ERR("Failed to initialize the Oculus SDK"); \ 
    return -1; \ 
} \ 
int result = -1; \ 
try { \ 
result = AppClass().run(); \ 
} catch (std::exception & error) { \ 
SAY_ERR(error.what()); \ 
} catch (std::string & error) { \ 
SAY_ERR(error.c_str()); \ 
} \ 
ovr_Shutdown(); \ 
return result; \ 
} 

Я знаю, StackOverflow не хочет ссылки, но в данном конкретном случае это может быть necceassary для того, чтобы получить более подробную информацию о используемых команд: https://github.com/OculusRiftInAction/OculusRiftInAction/blob/master/examples/cpp/common/ovr/OvrUtils.h

+0

выглядит как обычный код на C++, завернутый в макрос. что именно вы не понимаете? мы можем ответить лучше –

+3

Я считаю, что в качестве мусора - не используйте его. –

+0

Я запутался в основном по следующей строке: result = AppClass(). Run(); Означает ли это, что указанный Appclass выполняется в цикле в int main? – Echo88

ответ

-1

Код является частью набора примеров приложений для Oculus Rift, спроектированных таким образом, чтобы каждое примерное приложение могло в основном определять класс с помощью метода run, а затем включать макрос, чтобы класс мог выполняться независимо от платформы, и с Oculus SDK, инициализированным для времени жизни программы.

т.е.

class DemonstrateTechnique { 
    int run() { 
    ... do stuff ... 
    } 
} 

RUN_OVR_APP(DemonstrateTechnique) 

Here является актуальным примером макроса используется.

Макрос на самом деле не должен быть образцом чего-либо. Это просто удобный макрос, так что автору (мне) не нужно было писать кучу основных функций шаблона, которые создавали экземпляр класса и инициализировали SDK.

Точка методов инициализации/выключения внутри макроса заключается в обеспечении того, чтобы инициализированный OKUK SDK имел большую область действия, чем само приложение. Это действительно важно для версий SDK до 0,6, потому что в более старых версиях, если вы инициализировали SDK после, вы создали свой контекст OpenGL, было невозможно получить режим Direct HMD.

+0

Я был немного смущен методом run, потому что я не смог найти «int run()» в Example_13_4_StereoWebcamDemo.cpp. Поскольку я начинаю с ++, я хотел бы адаптировать код, чтобы я мог использовать класс WebcamApp в своем коде и только использовать этот класс для визуализации двух изображений, которые я пересылаю ему по команде. – Echo88

+0

Метод запуска для большинства классов, которые показывают окно OpenGL, будет фактически находиться в базовом классе 'GlfwApp'. Этот пример содержит класс, который происходит от RiftApp, который, в свою очередь, происходит от GlfwApp. – Jherico

0

исследующих макроопределения, смотря его реализация не достаточно, чтобы понять, как она используется в больших кодовых оснований из-за к макросам макросов «copy-paste».

Мое предложение состоит в том, чтобы получить предварительно обработанный файл и изучить, где и как используется макрос.

Для получения предварительно обработанного файла, пожалуйста, обратитесь к обсуждению ниже.

How do I see a C/C++ source file after preprocessing in Visual Studio?

1

Это ужасно, и я бы не использовать его, но это довольно ясно.

Он: (1) пытается инициализировать и возвращает -1, если он не может, а затем (2) вызывает AppClass.run() и возвращает результат, который он возвращает от него (3) закрытие событий. Плюс небольшое пятно исключения.

+0

Ах, я упустил ссылку на результат int. теперь это имеет смысл. спасибо :-) – Echo88

+0

Я написал этот макрос, поэтому спасибо за это. – Jherico

+0

_Why_ ты написал макрос? И _why_ вы пишете это так, а не используете какие-либо языковые возможности C++, которые позволили бы вам писать без использования макроса? –