用 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 应用程序中的真正入口点),进行一些初始化并最终调用您的主代码。它有一个带有argc
和argv
的签名,并且您几乎需要遵循它,所以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")));嘛意思