我有时会看到在C和C ++程序中NULL
用作返回值的编码器,main()
例如:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
当我用gcc编译此代码时,得到以下警告:
警告:return从指针转换为整数而不进行强制转换[-Wint-conversion]
这是合理的,因为宏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
不得扩展为(void*) 0
[support.types.nullptr]。它只能在C语言中这样做。
无论哪种方式,编写这样的代码都是令人误解的,因为无论如何实现,NULL
都应该引用空指针常量。使用它代替an int
是一个逻辑错误。
- 尽管有警告
NULL
,main()
还是使用0而不是0作为返回值的原因是什么?
无知。没有充分的理由这样做。
- 它是否是实现定义的,是否合适?如果是,为什么任何实现都希望返回一个指针值?
不,永远都不适合。编译器是否允许它取决于实现。合格的C ++编译器可能会毫无警告地允许它。
我通常遇到的重击:编译器是否允许它不是实现定义的;它是特定于实现的。在标准中,“实现定义的”表示实现必须记录其功能。
@PeteBecker编写它时我确实停了下来,但还是继续了(因为“特定于实现”和类似的短语听起来很不自然)。但是您是正确的,我会更改它。
在我看来,“实现定义”听起来很自然的唯一原因是人们习惯于误用它。<g>