为什么在 Mingw 中设置 sdl 时必须在主函数中传递参数?

Shu*_*war 1 c++ sdl mingw

这些论据有什么用?还有其他方法可以在不使用 main 中的参数的情况下运行 SDL 吗?

int main( int argc, char* args[] )
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 5

让我解释。

在通常的程序中,您可以使用以下两种有效形式之一main

int main()

int main(int argc, char **argv) // arguments' names do not matter here
Run Code Online (Sandbox Code Playgroud)

它们之间的区别在于第二种形式允许您的程序采用命令行参数。


但 SDL 使用了一种特殊的main相关 hack。

SDL#define main SDL_main在标题中的某个位置。
因此,预处理器将替换int main(...)int SDL_main(...).

实际main()位于 SDL 代码中的某个位置。它会进行一些初始化,然后调用您的“ main”(即SDL_main)。

实际情况main()可能是这样的:

extern SDL_main(int, char **);

int main(int argc, char **argv)
{
    // SDL initialization
    SDL_main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

它显示了为什么您可以使用int main(). SDL 源代码没有原型,int SDL_main()因为 C 不支持函数重载。只能有一个原型SDL_main,SDL 开发人员决定应该如此int SDL_main(int, char **)

原因很明显:许多应用程序需要使用命令行参数。许多程序员习惯于在工作int main(int, char **)时读取命令行参数。