Rob*_*rtS 10 c c++ null return return-value
我有时会看到编码器在 C 和 C++ 程序中NULL用作返回值main(),例如:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
当我用 gcc 编译这个`代码时,我收到以下警告:
警告:返回从指针生成整数而不进行强制转换 [-Wint-conversion]
这是合理的,因为宏NULL应扩展为(void*) 0并且 main 的返回值应为类型int。
当我制作一个简短的 C++ 程序时:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
并用 g++ 编译它,我确实得到了一个等效的警告:
警告:从 NULL [-Wconversion-null] 转换为非指针类型“int”
但是为什么它们在抛出警告时NULL用作返回值main()?这只是糟糕的编码风格吗?
NULL而不是0作为返回值的原因是什么main()?Kon*_*lph 14
这是合理的
是的。
因为宏
NULL应扩展为(void*) 0
NULL 不可以(void*) 0。在 C++ 中,宏不能扩展为[support.types.nullptr]。它可能只在 C 中这样做。
无论哪种方式,编写这样的代码都会产生误导,因为不管它是如何实现的,都NULL应该引用空指针常量。用它代替 anint是一个逻辑错误。
- 尽管有警告
NULL,main()但使用而不是 0 作为返回值的原因是什么?
无知。没有充分的理由这样做。
- 如果这合适与否,它是由实现定义的,如果是这样,为什么任何实现都想要取回指针值?
不,它永远不合适。编译器是否允许它取决于实现。符合标准的 C++ 编译器很可能会在没有警告的情况下允许它。
当我用 gcc 编译这个`代码时,我收到以下警告:
Run Code Online (Sandbox Code Playgroud)warning: return makes integer from pointer without a cast
这是因为您使用宽松的编译器选项进行编译。使用严格的 C 标准设置-std=c11 -pedantic-errors,您将在NULL扩展为空指针常量的实现中得到预期的编译器错误(void*)0。请参阅“来自整数的指针/来自没有强制转换的指针的整数”问题。
在NULL扩展为 的实现上0,代码严格来说符合标准,但风格非常糟糕,不可移植,最糟糕的是:完全是胡说八道。
并用 g++ 编译它,我确实得到了一个等效的警告:
Run Code Online (Sandbox Code Playgroud)warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]
在 C++11 及更高版本上,NULL不应使用 - 而是使用nullptr. 不管怎样,从 main() 返回它是不正确的。NULL总是0在 C++ 中扩展,所以严格来说它可以工作,但它是非常糟糕的风格,最糟糕的是:完全是胡说八道。
这只是糟糕的编码风格吗?
不仅糟糕,而且毫无根据的胡说八道的编码风格。编写它的程序员无能。