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


10

我有时会看到在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()
  • 它是否是实现定义的,是否合适?如果是,为什么任何实现都希望返回指针值?

4
您应该直接问他们。
juanchopanza

5
“为什么他们使用NULL作为main()的返回值”-我们没有。该代码的作者可以。我很想听听他们的理由。
WhozCraig

1
来自莫斯科的@Vlad是的,但是我必须检查它是否真的为0。^^- EXIT_FAILURE为8,由于使用1在某些程序中有时会取得成功,因此使用1似乎对失败没有好处。
Waelmio

2
@RobertSsupportsMonicaCellio如果那确实是您得到的回应,那真让人难过。首先,这没有任何意义(如果到处都是而不是在任何地方都更有意义)。其次,这是一个售罄。如果您正在编写代码,则最好对它是否正确有一个很好的指南。不只是去做,因为这似乎是某人完成的方式。您似乎有一根针指向正确的方向(因此您要问的原因);与其说是编写该代码的人,不如说是将您的答案作为原因。
WhozCraig

2
在c中,将NULL指针定义为0(不强制转换为void *)是完全有效的。在这种情况下,该缺陷不会引起注意,并且不会生成警告。仍然不是应该使用NULL的原因。
Ctx

Answers:


14

这是合理的

是。

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

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

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

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

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

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

不,这永远是不合适的。编译器是否允许它取决于实现。合格的C ++编译器可能会在没有警告的情况下允许它。


1
我通常遇到的重击:编译器是否允许尚未实现;它是特定于实现的。在标准中,“实现定义的”表示实现必须记录其功能。
皮特·贝克尔

@PeteBecker编写它时我确实停了下来,但还是继续了(因为“特定于实现”和类似的短语听起来很不自然)。但是您是正确的,我会更改它。
康拉德·鲁道夫

在我看来,“实现定义”听起来很自然的唯一原因是人们习惯于误用它。<g>
皮特·贝克尔

8

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

warning: return makes integer from pointer without a cast

这是因为您使用松散的编译器选项进行编译。使用严格的C标准设置-std=c11 -pedantic-errors,在NULL扩展到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 ++中扩展到,因此严格来说它会起作用,但这是非常糟糕的风格,最糟糕的是:完全废话。

这只是不好的编码风格吗?

不仅不好,而且没有任何理由的废话编码风格。编写它的程序员不称职。


2

这只是不好的编码风格吗?

更差。指示程序完成正常的正确方法是

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
那是纯粹的学究。根据C标准,参数的0 exit()(或main的返回值0)与的含义相同EXIT_SUCCESS
mosvy

从c99开始,您可以省略returnfrom main。因此,您的程序的更“正确”版本是int main(void){};-)
mosvy

1

在“部分/许多/全部”中?C ++实现NULL是一个扩展为的宏0

当有效扩展时,给出return 0。这是有效的返回值。

这只是不好的编码风格吗?

是。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.