【问题标题】:"Return type of main is not int" warning on macOS [duplicate]macOS上的“主要返回类型不是int”警告[重复]
【发布时间】:2018-05-15 18:44:07
【问题描述】:

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

void main(){

(...)

}

【问题讨论】:

  • 将main的返回类型改为int:int main(){
  • main 应该返回int(无论如何,在托管环境中)。是的,您会在网络上和很多书籍(包括一些好书)中看到无数 void main() 的例子——严格来说,这些都是不正确的。使用错误的返回类型会导致未定义的行为,并且编译器不需要为未定义的行为发出诊断。不过,现在有更多人这样做了,因为这是一个常见的错误。

标签: c warnings return-value main void


【解决方案1】:

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

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

    return 0;
}

【讨论】:

    【解决方案2】:

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

    C standard 详细说明托管环境的第 5.1.2.2.1 节规定如下:

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

    int main(void) { /* ... */ }
    

    或带有两个参数(此处称为argcargv,尽管任何 可以使用名称,因为它们对于它们所在的函数是本地的 声明):

    int main(int argc, char *argv[]) { /* ... */ }
    

    或等效或以其他实现定义的方式。

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

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

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

    【讨论】:

    【解决方案3】:

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

    int main() {
      return 0;
    }
    

    接受命令行参数的更正式的版本:

    int main(int argc, char** argv) {
      return 0;
    }
    

    用不同的类型声明它会使其不兼容。一些较旧的编译器可能不在乎,但 Xcode 会。

    C 已经存在了很长时间,并且与早期相比已经有了很大的发展。如果您使用的是较旧的参考资料,您可能会发现符号非常奇怪的示例,或者不再有价值的约定。

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2013-12-16
      相关资源
      最近更新 更多