【问题标题】:extern int main(int argc, char* argv[]) use?extern int main(int argc, char* argv[]) 使用?
【发布时间】: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 mainreturn 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


【解决方案1】:

extern mainreturn main(__argc, __argv) 在做什么?

如果你在windows平台上编译,SFML会为你定义WinMain入口点,并用__argc__argv调用你的main(int argc, char* argv[])relevant documentation解释:

__argc 全局变量是命令行数的计数 传递给程序的参数。 __argv 是一个指向数组的指针 包含 程序参数。

SFML 这样做是为了让开发人员即使在 Win32 应用程序项目中也可以使用标准的 main 函数,从而保持可移植的代码。 SFML/MainWin32.cpp 中的 cmets 对此进行了解释。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2011-07-08
    • 2014-10-09
    • 1970-01-01
    • 2013-09-08
    • 2014-04-23
    • 2013-04-01
    • 2015-08-12
    相关资源
    最近更新 更多