我有时会看到编码人员在 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
总是扩展到0
C++所以严格来说它会起作用,但这是非常糟糕的风格,最糟糕的是:完全是胡说八道。
只是糟糕的编码风格吗?
不仅糟糕,而且没有任何理由的无意义的编码风格。编写它的程序员无能。
只是糟糕的编码风格吗?
更 糟。指示程序完成良好的正确方法是
#include <stdlib.h>
int main (void)
{
return EXIT_SUCCESS;
}
In ?some/many/all?C++实现NULL
是一个扩展到0
的宏。
这在实际扩展时会给出return 0
.这是一个有效的返回值。
只是糟糕的编码风格吗?
是的。