我在Ubuntu中使用Emacs输入以下代码并使用命令行编译
#include <stdio.h>
int main(void)
{
printf("Hello World!\n\n");
return 0;
}
在main函数参数中包含void将返回以下警告
helloworld.c: In function ‘main’: helloworld.c:6:1: warning: control reaches end of non-void function [-Wreturn-type] } ^
当我删除&#34; void&#34;在括号内编译程序没有任何错误。这个程序中有main(void)
的错误是什么?
编译命令是
gcc -Wall -ggdb helloworld.c -o hello
答案 0 :(得分:4)
该错误与void
main()
签名中的int main(void)
无关,是正确的,是您定义main()
时的方法不需要处理命令行参数。
错误意味着您定义了int main(void)
并且您没有从函数返回值。喜欢这个
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
}
在较新版本的 gcc 中,main()
删除了此警告,因为main()
会在程序退出时隐式返回0
,除非您另有说明{{1}或者从exit()
返回一个明确的回复。
正常功能仍会触发此警告,并且由于未从函数返回并尝试捕获返回值,因此有助于防止未定义的行为。
答案 1 :(得分:3)
main()
函数警告的唯一方法是,如果您没有返回语句和,那么您正在C89 / C90模式下进行编译。
自C99起,main()
末尾的返回语句不是必需的,如果控制从return 0;
结束返回,则假定为main()
。所以在c99或C11模式下编译:
gcc -Wall -ggdb -std=c11 helloworld.c -o hello
不会触发该警告。或者如果您在c89 / C90中进行编译,请确保您有return
语句。直到最近(至少高达gcc 4.9),gcc中的默认模式是gnu90
。如果你没有通过std=
,那么你会得到一个警告而没有返回声明。
我认为你的实际代码中实际上没有return 0;
产生这个警告,因为如果你有一个明确的return
语句,你在编译它的C模式中无关紧要