繁体   English   中英

请解释这个C ++宏

[英]Please explain this c++ macro

我正在尝试改编特定的源代码示例,但是很难理解它如何保持对主循环的控制:

// 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不需要链接,但是在这种特殊情况下,它可能是必要的,以便获取有关所使用命令的更多信息: https : //github.com/OculusRiftInAction/OculusRiftInAction/blob/master/examples/cpp/common /ovr/OvrUtils.h

这太可怕了,我不会用,但是很清楚。

它:(1)尝试进行初始化,如果无法初始化则返回-1,然后(2)调用AppClass.run()并返回从中返回的结果,然后再将其关闭(3)。 加上一点异常捕获。

通过查看宏定义的实现来检查宏定义还不足以了解由于宏的“复制粘贴”性质而在大型代码库中如何使用它。

我的建议是获取经过预处理的文件,并检查在何处以及如何使用宏。

要获取预处理文件,请参考以下讨论。

在Visual Studio中进行预处理后,如何查看C / C ++源文件?

该代码是Oculus Rift的一系列示例应用程序的一部分,旨在使每个示例应用程序基本上可以使用run方法定义一个类,然后包含该宏,以便可以在不考虑平台和Oculus的情况下执行该类。在程序生命周期内初始化了SDK。

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

RUN_OVR_APP(DemonstrateTechnique)

是正在使用的宏的实际示例。

宏实际上并不是要示范任何东西。 它只是一个便利宏,因此作者(我)不必编写一堆用于实例化类和初始化SDK的样板主要功能。

宏中的init / shutdown方法的目的是确保要初始化的Oculus SDK具有比应用程序本身更大的作用域。 这实际上对于0.6之前的SDK版本至关重要,因为在较早的版本中,如果创建OpenGL上下文之后初始化了SDK,则无法使Direct HMD模式正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM