【发布时间】:2021-05-03 15:23:33
【问题描述】:
我一直在阅读 SFML 的源代码。我发现它以如下方式包装 win32 的方式:
#ifdef _WIN32 //something like that
#include <windows.h>
extern int main(int argc, char* argv[]);
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
{
return main(__argc, __argv);
}
#endif
所以line 4我看到了这个典型的win32程序入口。但是extern main 和return main(__argc, __argv) 在做什么呢?
带下划线的__argc 是什么?
在我自己加载SFML后的main函数中,我只需要写int main()。
我很好奇这在编写跨平台代码方面是如何工作的。 (我在我的 win32 代码中使用了同样的方式,它成功了!!有人解释一下这背后的魔力吗???)
【问题讨论】:
-
请不要在您显示的 code-sn-ps 中包含行号。如果您需要标记一行或其他内容,请在该行上添加注释。
-
至于例如
__argc和__argv你检查过编译器的文档吗?需要注意的是,任何以两个下划线开头的符号都保留供“实现”(即编译器及其标准库)内部使用。 -
至于
extern main(...);,这不是普通的函数前向声明。extern关键字通常不需要,因为默认情况下符号应该有外部linkage。 -
返回很简单:代码调用
main函数,取main返回和WinMain返回的值。它相当于int result; result = main(__argc, __argv); return result;即它将main视为可以调用并返回值的任何其他函数。 -
@JoonrooTaugh 值得注意的是,SFML 调用
main(argc, argv)并期望一些用户会实现main()的规则有点松散。有一个论点是在这种特定情况下这是有道理的,但它肯定不是任何人都应该在没有充分理由的情况下使用的模式。另一方面,将WinMain()设置为入口点而不是标准的main()是微软的错,所以这有点像以恶作恶。
标签: c++ cross-platform sfml