Hello world程序在main

时间:2015-12-23 19:48:03

标签: c ubuntu

我在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

编辑: 这是我想分享的屏幕截图 enter image description here

2 个答案:

答案 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模式中无关紧要