&引用;main的返回类型不是int";macOS上的警告

&引用;main的返回类型不是int";macOS上的警告,c,warnings,return-value,main,void,C,Warnings,Return Value,Main,Void,所以我有一台MacBook Pro 2017,每当我编译一个程序作为“void main”时,编译器都会给我一个警告,告诉我main的返回类型不是int void main(){ (...) } 正如警告所说,您应该将返回类型定义为int: int main() { // bunch of code... return 0; } 预计main()将返回一个int值。最起码的开始是: int main() { return 0; } 接受命令行参数的更正式版本: i

所以我有一台MacBook Pro 2017,每当我编译一个程序作为“void main”时,编译器都会给我一个警告,告诉我main的返回类型不是int

void main(){

(...)

}

正如警告所说,您应该将返回类型定义为
int

int main() {
    // bunch of code...

    return 0;
}

预计
main()
将返回一个
int
值。最起码的开始是:

int main() {
  return 0;
}
接受命令行参数的更正式版本:

int main(int argc, char** argv) {
  return 0;
}
int main(void) { /* ... */ }
使用其他类型声明它会使其不兼容。一些较旧的编译器可能不在乎,但Xcode的编译器在乎


C已经存在很长一段时间了,并且从它的早期就有了很大的发展。如果您使用的是较旧的引用,您可能会发现带有非常奇怪的符号的示例,或者不再有价值的约定。

当前版本的C标准要求
main
函数的返回类型为
int
。因此,您需要将定义更改为
intmain()
,并让它返回一个值

详细说明托管环境的第5.1.2.2.1节说明了以下内容:

1程序启动时调用的函数名为
main
。实现没有声明此函数的原型<应该是 使用返回类型
int
定义且不带参数:

int main(int argc, char** argv) {
  return 0;
}
int main(void) { /* ... */ }
或具有两个参数(此处称为
argc
argv
,尽管有 可以使用名称,因为它们是其所在函数的本地名称 声明):

或同等的,或以某种其他实现定义的方式

请注意,
int main()
的定义是允许的,因为空参数列表意味着函数不接受任何参数。根据第6.7.6.3节:

14标识符列表仅声明函数参数的标识符函数声明符中的空列表 这是该函数定义的一部分,指定 函数没有参数。函数声明符中的空列表 这不是该函数定义的一部分,它指定 提供了有关参数数量或类型的信息


将main函数指定为
void main()
是K&R时代的一个预标准化变体,不再有效。

将main的返回类型更改为int:
int main(){
main
应该返回
int
(无论如何,在托管环境中)。是的,您将看到无数的
void main的示例()
在网上和几本书中(包括一些好书)-严格来说,这些都是不正确的。使用错误的返回类型会导致未定义的行为,并且编译器不需要为未定义的行为发出诊断。不过,现在有更多的编译器正在这样做,因为这是一个非常常见的错误。可能有一些关于为什么
int main()的注释
int main(void)
?@DavidBowling Done.Hmmm的合法替代品。我想:。这不适用于这里吗?@DavidBowling啊,正确。我想的是声明而不是定义。我会更新。