为什么你会在C中的main()函数之前使用数据类型?

时间:2010-05-23 17:54:40

标签: c main

许多人都熟悉C语言中的hello world程序:

#include <stdio.h>

main ()
{
    printf ("hello world");
    return 0;
}

为什么有些main()函数位于int之前,如下所示:

int main()

另外,我在void内输入了()这个词,如下所示:

int main(void)

似乎没有什么额外的打字,但也许这是一种在其他情况下支付股息的最佳做法?

另外,如果你要返回一个字符串,为什么在main()之前加一个int?如果有的话,人们会期望:

char main(void)

我也很担心为什么我们在函数结束时返回0。

8 个答案:

答案 0 :(得分:13)

main函数返回一个整数状态代码,告诉操作系统程序是否成功退出 return 0表示成功;返回任何其他值表示失败。

由于这是一个整数而不是字符串,因此它返回int,而不是charchar*。 (调用printf与从函数返回没有任何关系)

旧版本的C允许默认返回类型为int 但是,最好明确指定返回类型。

在C语言中(与C ++不同),不带任何参数的函数声明为int myFunc(void)

答案 1 :(得分:12)

以下内容在C89中有效

main() {
  return 0;
}

但是在现代C(C99)中,这是不允许的,因为你需要明确地告诉变量的类型和函数的返回类型,所以它变成了

int main() {
  return 0;
}

此外,省略现代C中的return 0是合法的,因此编写

是合法的
int main() {

}

行为就好像它返回0.

人们将void放在括号之间,因为它确保了函数调用的正确类型检查。 C中的一组空括号表示没有关于参数的数量和类型的信息暴露在函数之外,并且调用者必须完全知道这些。

void f();
 /* defined as  void f(int a) { } later in a different unit */

int main() {
  f("foo");
}

f的调用会导致未定义的行为,因为编译器无法根据f在其他模块中的预期来验证参数的类型。如果您使用voidint编写它,编译器就会知道

void f(int); /* only int arguments accepted! */

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}

因此对main来说,将void放在那里只是一个好习惯,因为在其他地方做这件事很好。在C中,您可以递归调用main,在这种情况下,这种差异甚至可能很重要。

可悲的是,只有少数编译器支持现代C,因此在许多C编译器上,您仍然可能会收到使用现代C功能的警告。

此外,您可能会看到声明main的程序返回的内容与int不同。如果这些程序使用独立式 C实现,则可以这样做。这样的C实现不会对main施加任何限制,因为它们甚至不知道或者首先需要这样的功能。但是要为程序的入口点提供通用且可移植的接口,C规范要求严格符合程序以使用返回类型int声明main,并要求托管的 C实现接受此类程序。

答案 2 :(得分:5)

它被称为退出状态。程序完成后,您希望让被叫方知道您的程序是如何退出的。如果它正常退出,您将返回0等。

Here,您可以在这里了解有关退出状态的更多信息。

答案 3 :(得分:3)

  

为什么有一些在main()函数之前用int作为:

在C(无论如何,这是你似乎指的那个)中,当函数没有任何数据类型时,函数默认返回int。在int之前进行最终只是一个偏好问题。

  

另外,我在()中看到了'void'这个词,如下所示:

这也是一个偏好问题,但这两个完全不同

f(void)表示函数f接受zero个参数,而f()表示函数f接受an unspecified number of arguments

f(void)是声明在C中不带参数的函数的正确方法。

  

似乎没有什么额外的打字,但也许这是一种在其他情况下支付股息的最佳做法?

好处是清晰度。如果你打算认为减少打字是好的,那么你如何考虑用尽可能少的字符命名所有函数和变量以及文件和所有内容?

  

另外,如果你要返回一个字符串,为什么在main()之前加一个int?如果有的话,人们会期望:

     

char main(void)

什么?为什么在这个世界上你会从main返回一个字符串?绝对没有理由这样做......

此外,您的main声明会返回一个字符,而不是字符串。

  

我也很担心为什么我们在函数结束时返回0。

程序在结束时向操作系统返回一个值。该值可用于向操作系统通知某些事情。例如,如果发现病毒,您的病毒扫描程序可能会返回1,如果找不到病毒,则会返回0,如果发生某些错误,则会2。通常,0表示没有错误,一切顺利。

答案 4 :(得分:2)

这背后的原因是提供某种形式的错误报告机制。因此,只要程序返回零值,通常意味着它认为它成功完成了任务。对于非零值,程序由于某种原因失败。时不时地,该数字可能对应于某个错误消息。 C中的几个系统API调用返回返回代码以指示处理是否成功。由于C中没有例外概念,因此判断您的通话是否成功是最佳方式。

答案 5 :(得分:1)

大多数操作系统都使用退出代码来处理应用程序通常,0是成功的退出代码(例如,应用程序已成功完成)。 main()的返回值是返回给OS的,这就是为什么main()通常返回一个整数(并且0成功的原因,大多数C程序都会有return 0;最后)。

答案 6 :(得分:1)

主函数声明之前的“int”是函数的返回类型。也就是说,该函数返回一个整数。

从该功能中,您可以返回一段数据。如果函数成功完成,通常返回“0”。如果程序未成功执行,则返回任何其他数字,最多255,以显示发生的错误。

也就是说,返回0,使用int数据类型,以显示程序正确执行。

答案 7 :(得分:1)

使用int main(int argc, char * argv[])是传统的,因为整数返回可以指示程序的执行方式。返回0表示程序成功执行,而-1表示它有某种失败。通常,退出代码将非常具体,并且将用作调试方法,因为C中不存在异常(在C ++意义上)。