C++ 为什么SDL定义主宏?
在设置SDL时遇到一些问题,我发现SDL定义了一个宏来替换main:C++ 为什么SDL定义主宏?,c++,sdl,main,C++,Sdl,Main,在设置SDL时遇到一些问题,我发现SDL定义了一个宏来替换main: #define main SDL_main // And then extern C_LINKAGE int SDL_main(int argc, char *argv[]); 如果主函数没有定义argc和argv参数,这也会产生编译错误 当我看到这个宏时,它会让我头疼。。。为什么SDL需要重新定义main?在进一步搜索之后,我发现一些人#undefmain,并以正常方式使用它 这就是问题:为什么SDL需要重新定义main
#define main SDL_main
// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);
如果主函数没有定义argc
和argv
参数,这也会产生编译错误
当我看到这个宏时,它会让我头疼。。。为什么SDL需要重新定义main?在进一步搜索之后,我发现一些人#undefmain
,并以正常方式使用它
这就是问题:为什么SDL需要重新定义main,它做什么?取消定义它有什么副作用吗
我注意到的一点是,SDL将标准输出和错误重定向到文件(我不希望出现这种行为),如果我取消定义main,这种行为将停止。Per:
即使您正在创建Windows应用程序,也应该使用main()
而不是WinMain()
,因为SDL提供了一个版本的WinMain()
,它在调用主代码之前执行一些SDL初始化
如果出于某种原因需要使用WinMain()
,请查看src/main/win32/SDL\u main.c
中的SDL源代码,了解需要在WinMain()
函数中执行何种初始化,以使SDL正常工作
SDL需要初始化,因此它注入自己的main
函数,该函数在调用“main”函数之前运行初始化,并将该函数重命名为SDL\u main
,这样它就不会与实际的main
函数冲突。如常见问题解答中所述,您的main
函数必须采用以下格式
int main(int argc, char* argv[])
虽然我同意这是一种奇怪的做法,但在某些情况下,这是一种合理的解决方案,尽管这在很大程度上取决于平台。考虑不同的平台有不同的入口点。Windows通常是WinMain,Linux是main,在Java中与Android交互,WinRT使用C++/CX扩展,等等。程序入口点和API可以是非常特定于平台的,SDL试图为您省去处理这个问题的麻烦。如果您只针对Windows,而SDL只是为了省去使用WIN32 API的麻烦,那么您可能不需要它。但如果您超越桌面,我认为它很有用。几乎每个库都需要初始化,但这看起来是一个糟糕的做法+1无论如何。@DavidGrayson的做法确实很糟糕,尤其是如果你有两个库可以做到这一点的话……这是一件非常麻烦的事情,我可以自己编写main()的实现,而不是使用这个奇怪的SDL_main()函数吗?有一些事情(例如,stdout重定向)让我有点受不了,我不想要它。同意David的观点。此宏是一种C技术。C++有许多明智的选择。不仅我同意戴维的观点,这是一个很差的实践,但是SDL有自己的SDLIN初始化调用。就我所记得的,SDLmain中的初始化是非常无用的(如果我记得的话,控制台的重定向)“超越桌面”-嘿!Linux和OSX也是桌面系统。“Windows通常是WINMAST”,在任何MinGW toolchain上,你可以使用标准的C或C++ <代码>主< /代码>,MinGW会做这项工作使它工作。这样做的主要原因是在Windows上的不同入口点(winmain)和其他平台上的传统入口点(int main)上进行抽象。它简化了许多原本需要ifdef或单独源文件的代码。这是一种方便的机制,如果您愿意,可以手动完成。