请看下面这段来自《OpenGL超级经验法则》第7版的main.cpp
代码:
#include "sb7.h"
class my_application : public sb7::application
{
void render(double currentTime)
{
static const GLfloat red[] = { 1.0f, 0.0f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, red);
}
};
DECLARE_MAIN(my_application);
在
sb7.h
中,关于 DECLARE_MAIN()
的相关代码如下:#if defined _WIN32
#define DECLARE_MAIN(a) \
sb7::application *app = 0; \
int CALLBACK WinMain(HINSTANCE hInstance, \
HINSTANCE hPrevInstance, \
LPSTR lpCmdLine, \
int nCmdShow) \
{ \
a *app = new a; \
app->run(app); \
delete app; \
return 0; \
}
#elif defined _LINUX || defined __APPLE__
#define DECLARE_MAIN(a) \
int main(int argc, const char ** argv) \
{ \
a *app = new a; \
app->run(app); \
delete app; \
return 0; \
}
#else
#error Undefined platform!
#endif
使用这种不寻常的方法有什么好处?代码结构的可读性受到了威胁,但我猜想背后肯定有一定的用意。请注意,作者使用第三方glfw来处理窗口和用户输入,例如键盘和鼠标输入。我不明白他们为什么需要使用“CALLBACK WinMain()”,我知道它仅与Windows操作系统相关。说实话,看到不同的方法很好。
_WIN32
上的入口点是WinMain
,而在大多数其他环境中的入口点是main
。 - EljayWinMain
是应用程序的默认入口点,如此文档所述:https://learn.microsoft.com/en-us/windows/win32/learnwin32/winmain--the-application-entry-point。 - dxivmain()
用作普通的C++项目,它会被内部转换,以便入口点为WinMain
?! - CroComainCRTStartup
的入口点。但这在 CRT 代码中是“隐藏”的,您只会看到熟悉的main
。 - dxivDECLARE_MAIN()
宏。该宏(有条件地)使用不同的入口点,因此呈现的代码示例将适用于Windows、Linux和其他操作系统,这些操作系统都使用不同的入口点来进行基于GUI的程序。由于样板代码不需要在每个代码示例中重复,因此该书更短且更易于编写。打印也会消耗更少的纸张。如果读者为程序入口点编写了不同的代码,则如果代码示例无法正常工作,他们不能责怪书的作者和出版商。 - Peter