请解释这个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; \
}
我知道 Whosebug 不需要链接,但在这种特殊情况下,它可能是必要的,以便获得有关所用命令的更多信息:
https://github.com/OculusRiftInAction/OculusRiftInAction/blob/master/examples/cpp/common/ovr/OvrUtils.h
由于宏的 "copy-paste" 性质,通过查看其实现来检查宏定义不足以理解它在大型代码库中的使用方式。
我的建议是获取预处理文件并检查宏的使用位置和方式。
获取预处理后的文件请参考下面的讨论。
How do I see a C/C++ source file after preprocessing in Visual Studio?
太可怕了,我不会用它,但它很清楚。
它:(1) 尝试初始化,如果不能初始化 returns -1,然后 (2) 调用 AppClass.run()
和 returns 从中返回的结果在 (3) 关闭之前。加上一点点异常捕获。
该代码是 Oculus Rift 的一组示例应用程序的一部分,旨在让每个示例应用程序基本上可以定义一个 class 和 运行 方法,然后包含宏,以便class 可以在任何平台上执行,并且在程序的生命周期内初始化 Oculus SDK。
即
class DemonstrateTechnique {
int run() {
... do stuff ...
}
}
RUN_OVR_APP(DemonstrateTechnique)
Here 是正在使用的宏的实际示例。
该宏并不是真正要成为任何事物的典范。它只是一个方便的宏,因此作者(我)不必编写一堆样板主要函数来实例化 class 并初始化 SDK。
宏中 init/shutdown 方法的要点是确保正在初始化的 Oculus SDK 具有比应用程序本身更大的范围。这对于 0.6 之前的 SDK 版本实际上很重要,因为在旧版本中,如果您在创建 OpenGL 上下文 之后 初始化 SDK,则无法使直接 HMD 模式工作。
我正在尝试改编一个特定的源代码示例,但很难理解它如何保持对主循环的控制:
// 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; \
}
我知道 Whosebug 不需要链接,但在这种特殊情况下,它可能是必要的,以便获得有关所用命令的更多信息: https://github.com/OculusRiftInAction/OculusRiftInAction/blob/master/examples/cpp/common/ovr/OvrUtils.h
由于宏的 "copy-paste" 性质,通过查看其实现来检查宏定义不足以理解它在大型代码库中的使用方式。
我的建议是获取预处理文件并检查宏的使用位置和方式。
获取预处理后的文件请参考下面的讨论。
How do I see a C/C++ source file after preprocessing in Visual Studio?
太可怕了,我不会用它,但它很清楚。
它:(1) 尝试初始化,如果不能初始化 returns -1,然后 (2) 调用 AppClass.run()
和 returns 从中返回的结果在 (3) 关闭之前。加上一点点异常捕获。
该代码是 Oculus Rift 的一组示例应用程序的一部分,旨在让每个示例应用程序基本上可以定义一个 class 和 运行 方法,然后包含宏,以便class 可以在任何平台上执行,并且在程序的生命周期内初始化 Oculus SDK。
即
class DemonstrateTechnique {
int run() {
... do stuff ...
}
}
RUN_OVR_APP(DemonstrateTechnique)
Here 是正在使用的宏的实际示例。
该宏并不是真正要成为任何事物的典范。它只是一个方便的宏,因此作者(我)不必编写一堆样板主要函数来实例化 class 并初始化 SDK。
宏中 init/shutdown 方法的要点是确保正在初始化的 Oculus SDK 具有比应用程序本身更大的范围。这对于 0.6 之前的 SDK 版本实际上很重要,因为在旧版本中,如果您在创建 OpenGL 上下文 之后 初始化 SDK,则无法使直接 HMD 模式工作。