用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为啥?

Posted

技术标签:

【中文标题】用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为啥?【英文标题】:Compiling with int main(void) fails; main(int argc, char *argv[]) succeeds. Why?用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为什么? 【发布时间】:2011-12-29 20:58:53 【问题描述】:

问题

如果程序不使用命令行传递的参数,为什么编译具有int main(void) main 函数的程序与编译具有int main(int argc, char *argv[]) main 函数的程序不同?

这个操作系统或编译器是特定的吗?我使用 mingw 和 g++ 没有得到相同的结果(这很奇怪,因为wingw 是 gcc 的一个端口)


示例

代码

#include <iostream>
#include"SDL/SDL.h"
int main(void)

    return 0;

编译命令

g++ test.cpp; #g++ 4.4.5
i586-mingw32msvc-g++ test.cpp; # mingw 4.4.4

错误

(由第二个命令给出。)

a(main.o):(.text+0x85): undefined reference to `_WinMain@16'

【问题讨论】:

它是特定于编译器的......但int main (int argc, char *argv[]) 是“正确的”。我会推荐 ALWAYS 在你的 C 和 C++ 代码中使用后一种形式 ALL @paulsm4: int main(void) 也是正确的。 ***.com/questions/3156423/… 请提供示例程序、调用编译器的确切命令、编译器的确切输出以及编译器的种类和版本。没有这些信息,没有人可以明确回答您的问题。 您可能会考虑告诉我们一些比“失败”更具体的内容。编译错误(如果是,消息是什么?)链接器错误(如果是,消息是什么?)运行时错误(如果是,是什么?)目前,人们可以猜测。 【参考方案1】:

这是 SDL 的事情。在 Windows 上,当您包含 SDL.h 时,main 被重新定义为 SDL_main,它调用 WinMain(非控制台 Windows 应用程序中的真正入口点),进行一些初始化并最终调用您的主代码。它有一个带有argcargv 的签名,并且您几乎需要遵循它,所以int main() 将不起作用。

【讨论】:

(我编辑错误 -> 重新编辑)那为什么它可以与 g++ 一起工作? @danjjl 因为它只在 Windows 上重新定义。 (我假设您正在其他平台上使用 g++ 进行编译) 很好 :),你在哪里找到的信息?在我没有真正使用 SDL 的示例中,这仍然适用吗? 在 SDL 网站的常见问题解答部分中提到,并且在他们的论坛中有很多关于此问题的主题。 是的,因为我没有链接 SDL(事件我以为我不需要,因为它没有被使用)。链接 SDL 会得到 Undefined reference to 'SDL_main',这在 FAQ 中有所介绍【参考方案2】:

main(...) 的规范是一个契约。在 C 语言中,合同规定参数是 int 和 char **。如果您的程序希望环境与之交互,这是您的程序必须满足的要求。

您的程序是否要使用参数是一个不同的问题——它只需要遵守约定,即有一个名为 main 的函数,具有正确的参数顺序和类型。

【讨论】:

这个问题是关于 C++,而不是 C。也就是说,这个答案是不正确的:int main(void) 在 C(C90、C99 和 C11)和C++(C++98、C++03 和 C++11)。

以上是关于用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

请问在C程序中啥时候用int main() 啥时候用 void main()。二者是不是可以相互代替?

int main (void) __attribute__ ((weak, alias ("alt_main")));嘛意思

Dev C++为啥不支持以void main()为主函数的空函数C程序?老师给出的一直都是以Tu

代码崩溃编译器:main() 返回结构而不是 int

课程作业02

课程作业02-2