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

Mil*_*der 13 c program-entry-point

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

#include <stdio.h>

main ()
{
    printf ("hello world");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

int main()
Run Code Online (Sandbox Code Playgroud)

另外,我已经看到void输入的内容()如下:

int main(void)
Run Code Online (Sandbox Code Playgroud)

这似乎是额外的打字,但也许这是一个在其他情况下支付红利的最佳做法?

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

char main(void)
Run Code Online (Sandbox Code Playgroud)

关于为什么我们在函数结束时返回0也很模糊.

SLa*_*aks 13

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

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

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

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

  • main是_not_ special wrt省略返回类型.如果没有指定,则C将假定返回类型为int. (3认同)
  • 最新的C标准(IIRC)将`main`定义为不带参数(`void`)或两个与`(int,char**)`兼容的参数.return语句是可选的.在程序执行期间定义的标准是从main返回等同于对具有相同值的`exit()`的调用,如果不存在返回,则在main的末尾执行隐式的`return 0;`.根据C的版本,没有定义返回类型的函数被隐式地认为是返回main,所以`main(void)`是正确的,因为它隐含地意味着`int main(void)`,我不确定它是否有效C99虽然. (2认同)

Joh*_*itb 12

以下内容在C89中有效

main() {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

int main() {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

int main() {

}
Run Code Online (Sandbox Code Playgroud)

行为就好像它返回0.

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

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

int main() {
  f("foo");
}
Run Code Online (Sandbox Code Playgroud)

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

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

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jac*_*kin 5

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

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