为什么要从main()返回NULL?



我有时会看到编码人员在 C 和 C++ 程序中使用NULL作为main()的返回值,例如:

#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
} 

当我使用 gcc 编译此代码时,我收到以下警告:

警告:return 从指针生成整数而不强制转换 [-Wint 转换]

这是合理的,因为宏NULL应扩展到(void*) 0,并且 main 的返回值应为int类型。

当我做一个简短的C++程序时:

#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}

并使用g ++编译它,我确实得到了等效的警告:

警告:从 NULL 转换为非指针类型"int" [-Wconversion-null]

但是,为什么他们在抛出警告时使用NULL作为main()的返回值呢?只是糟糕的编码风格吗?


  • 尽管有警告,但使用NULL而不是0作为main()的返回值的原因是什么?
  • 它是否由实现定义,如果合适,为什么任何实现都想要返回指针值?

这是合理的

是的。

因为宏NULL应扩展到(void*) 0

不。C++宏NULL不得扩展到 [support.types.nullptr](void*) 0。它可能只在 C 中这样做。

无论哪种方式,编写这样的代码都是误导性的,因为NULL应该引用空指针常量,而不管它是如何实现的。使用它代替int是一个逻辑错误。

  • 尽管有警告,使用NULL而不是 0 作为main()的返回值的原因是什么?

无知。没有充分的理由这样做。

  • 它是否由实现定义,如果合适,为什么任何实现都想要返回指针值?

不,这绝不合适。编译器是否允许它取决于实现。符合标准的C++编译器很可能允许它而不会发出警告。

当我使用 gcc 编译此代码时,我收到以下警告:

warning: return makes integer from pointer without a cast

这是因为您使用宽松的编译器选项进行编译。-std=c11 -pedantic-errors使用严格的 C 标准设置,在NULL扩展到空指针常量(void*)0的实现上,您将获得预期的编译器错误。请参阅"来自整数的指针/来自没有强制转换的指针的整数"问题。

NULL扩展到0的实现中,代码严格来说符合标准,但风格非常糟糕,不可移植,最糟糕的是:完全是胡说八道。

并使用g ++编译它,我确实得到了等效的警告:

warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]

在 C++11 及更高版本中,不应使用NULL- 而应使用nullptr。无论如何,从 main(( 返回它是不正确的。NULL总是扩展到0C++所以严格来说它会起作用,但这是非常糟糕的风格,最糟糕的是:完全是胡说八道。

只是糟糕的编码风格吗?

不仅糟糕,而且没有任何理由的无意义的编码风格。编写它的程序员无能。

只是糟糕的编码风格吗?

更 糟。指示程序完成良好的正确方法是

#include <stdlib.h>
int main (void)
{
return EXIT_SUCCESS;
}

In ?some/many/all?C++实现NULL是一个扩展到0的宏。

这在实际扩展时会给出return 0.这是一个有效的返回值。

只是糟糕的编码风格吗?

是的。

相关内容

  • 没有找到相关文章

最新更新