Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么SDL定义主宏?_C++_Sdl_Main - Fatal编程技术网

C++ 为什么SDL定义主宏?

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

在设置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,它做什么?取消定义它有什么副作用吗

我注意到的一点是,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或单独源文件的代码。这是一种方便的机制,如果您愿意,可以手动完成。