我有时会看到在C和C ++程序中使用NULL作为main()的返回值的编码器,例如:
1 2 3 4 5 6 7 8
| #include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
} |
当我用gcc编译此代码时,得到以下警告:
warning: return makes integer from pointer without a cast [-Wint-conversion]
这是合理的,因为宏NULL应扩展为(void*) 0,并且main的返回值应为int类型。
当我制作一个简短的C ++程序时:
1 2 3 4 5 6 7 8 9
| #include <iostream>
using namespace std;
int main()
{
cout <<"HelloWorld!";
return NULL;
} |
并使用g ++进行编译,我得到了等效的警告:
warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]
但是,为什么当它们发出警告时,为什么使用NULL作为main()的返回值呢? 这只是不好的编码风格吗?
-
尽管有警告,还是使用NULL而不是0作为main()的返回值的原因是什么?
-
它是否是实现定义的,是否合适?如果是,为什么任何实现都希望返回指针值?
-
您应该直接问他们。
-
"为什么他们使用NULL作为main()的返回值"-我们没有。该代码的作者可以。我很想听到他们为证明自己的理由而进行的尝试。
-
Ive已经问过一个@juanchopanza,他说:"我在其他任何地方都见过。"
-
@kiranBiradar什么是EXIT_SUCCESS?
-
The value of EXIT_SUCCESS is defined in stdlib.h as 0说文档
-
@WhozCraig Ive说了"他们",意思是用这种方式编码的人。我不认为每个人都那样做,这绝对不是事实。我已经问过一个,他说:"我在其他任何地方都看过。"
-
@Waelmio而且EXIT_SUCCESS是一个宏。:)
-
@Waelmio Thats IBM的实现。 EXIT_SUCCESS的实际值是实现定义的。标准要求退出EXIT_SUCCESS或零是程序退出时有效的成功指示符的原因之一。 (7.22.4.4)
-
来自莫斯科的@Vlad是的,但是我必须检查它是否真的为0。^^-EXIT_FAILURE为8,由于使用1在某些程序中有时会取得成功,因此使用1似乎对失败没有好处。
-
@RobertSsupportsMonicaCellio如果那确实是您得到的回应,那真是令人难过。首先,它没有任何意义(如果它在任何地方而不是任何地方,都会更有意义)。其次,这是一个售罄。如果您正在编写代码,则最好对它是否正确有一个很好的指南。不只是去做,因为多数民众赞成在某人看来。您似乎有一根针指向正确的方向(因此您为什么要问);与其说是编写该代码的人,不如说是将您的答案作为原因的原因。
-
在c中,将NULL指针定义为0(不强制转换为void *)是完全有效的。在这种情况下,该缺陷不会引起注意,并且不会生成警告。仍然不是应该使用NULL的原因。
-
@WhozCraig是的,同意。但是我只是想问一下是否有任何理由以这种奇怪的方式进行编码,我可能已经错过了。但是似乎不是,我很高兴如此。非常感谢你。
-
我已经编码了一段时间了。我从未见过在main中使用return NULL;的任何代码。"这只是不好的编码风格吗?"是的,非常。
-
@ machine_1我的意图不是要专门责怪任何人,尤其是因为这是一种过时的编码风格(假设它是有效的/警告会保留警告,而不是通过相对的编译器标志迁移到错误中)。我认为,这仅仅是因为基于错误假设的纯粹混淆,NULL应当等于0的整数值,而不是这种情况。
which is reasonable
是。
because the macro NULL shall be expanded to (void*) 0
否。在C ++中,宏NULL不得扩展为(void*) 0 [support.types.nullptr]。它只能在C语言中这样做。
无论哪种方式,编写这样的代码都会产生误导,因为NULL应该被引用为空指针常量,而不管其实现方式如何。用它代替int是逻辑错误。
-
What is the reason to use NULL instead of 0 as return value of main() despite the warning?
无知。没有充分的理由这样做。
-
Is it implementation-defined if this is appropriate or not and if so why shall any implementation would want to get a pointer value back?
不,永远都不适合。编译器是否允许它取决于实现。合格的C ++编译器可能会毫无警告地允许它。
-
我通常遇到的重击:编译器是否允许尚未实现; 它是特定于实现的。 在标准中,"实现定义的"表示实现必须记录其功能。
-
@PeteBecker编写它时我确实停了下来,但还是继续了(因为"特定于实现"和类似的短语听起来很不自然)。 但是您是正确的,我会更改它。
-
在我看来,"实现定义"听起来很自然的唯一原因是人们习惯于误用它。
When I compile this `code with gcc I get the warning of:
1
| warning: return makes integer from pointer without a cast |
这是因为您使用松散的编译器选项进行编译。使用严格的C标准设置-std=c11 -pedantic-errors,在NULL扩展为空指针常量(void*)0的实现上,您将得到预期的编译器错误。请参阅"来自整数的指针/没有转换的指针的整数"问题。
在NULL扩展为0的实现中,代码严格来说符合标准,但是样式非常糟糕,不可移植且最糟糕的是:完全废话。
And compile it with g++, I do get an equivalent warning:
1
| warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null] |
在C ++ 11及更高版本上,不应该使用NULL-而是使用nullptr。无论如何,从main()返回它都是不正确的。 NULL在C ++中始终会扩展为0,因此严格来说它可以工作,但这是非常糟糕的样式,最糟糕的是:完全废话。
Is it just bad coding style?
不仅不好,而且没有任何理由的废话编码风格。编写它的程序员不称职。
Is it just bad coding style?
更差。指示程序完成正常的正确方法是
1 2 3 4 5 6
| #include <stdlib.h>
int main (void)
{
return EXIT_SUCCESS;
} |
-
那是纯学究。 根据C标准,exit()的参数为0(或main的返回值为0)与EXIT_SUCCESS相同。
-
从c99开始,您可以从main省略return。 因此,程序的"更正确"版本是int main(void){} ;-)
在"部分/许多/全部"中? C ++实现NULL是扩展为0的宏。
实际上展开时,将给出return 0。这是有效的返回值。
Is it just bad coding style?
是。