代码之家  ›  专栏  ›  技术社区  ›  RobertS supports Monica Cellio

为什么从main()返回NULL?

  •  0
  • RobertS supports Monica Cellio  · 技术社区  · 5 年前

    我有时会看到程序员使用 NULL 作为返回值 main() 例如,在C和C++程序中:

    #include <stdio.h>
    
    int main()
    {
        printf("HelloWorld!");
    
        return NULL;
    } 
    

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

    警告:return从指针返回整数而不进行强制转换[-Wint转换]

    这是合理的,因为宏观 无效的 应扩展到 (void*) 0 main的返回值应为 int .

    当我编写一个简短的C++程序时:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "HelloWorld!";
    
        return NULL;
    }
    

    用g++编译它,我确实得到了一个等效的警告:

    警告:从NULL转换为非指针类型int[-Wconversion NULL]

    但他们为什么要使用 无效的 作为返回值 main() 当它发出警告时?这只是糟糕的编码风格吗?


    • 使用的原因是什么 无效的 而不是 0 作为返回值 main() 尽管有警告?
    • 是否定义了实现,这是否合适,如果是这样,为什么任何实现都想得到一个指针值?
    2 回复  |  直到 5 年前
        1
  •  14
  •   Konrad Rudolph    5 年前

    这是合理的

    对。

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

    不是的。在C++中,宏 无效的 不能 扩展到 (无效*)0 [support.types.nullptr]。它只能在C中这样做。

    无论哪种方式,编写这样的代码都会产生误导,因为 无效的 应该是指 空指针常量 不管它是如何实施的。用它来代替 int 这是一个逻辑错误。

    • 使用的原因是什么 无效的 而不是0作为返回值 main() 尽管有警告?

    无知。没有 好的 这样做的理由。

    • 是否定义了实现,这是否合适,如果是这样,为什么任何实现都想得到一个指针值?

    不,从来没有 适当的 编译器是否编译取决于实现 允许 一个符合标准的C++编译器可能会在没有警告的情况下允许它。

        2
  •  8
  •   Community CDub    5 年前

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

    warning: return makes integer from pointer without a cast
    

    这是因为您使用宽松的编译器选项进行编译。使用严格的C标准设置 -std=c11 -pedantic-errors 在以下实现中,您将得到预期的编译器错误 NULL 扩展为空指针常量 (void*)0 。参见 “Pointer from integer/integer from pointer without a cast” issues .

    关于实施情况 无效的 扩展到 0 ,严格来说,代码符合标准,但风格很差,不可移植,最糟糕的是:完全是胡说八道。

    用g++编译它,我确实得到了一个等效的警告:

    warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]
    

    在C++11及更高版本上, 无效的 不应该使用,而是使用 nullptr .无论如何,从main()返回它都是不正确的。 无效的 总是扩展到 0 在C++中,严格来说它是可行的,但它的风格非常糟糕,最糟糕的是:完全是胡说八道。

    这只是糟糕的编码风格吗?

    不仅糟糕,而且毫无道理的编码风格。编写它的程序员不称职。

        3
  •  3
  •   emacs drives me nuts    5 年前

    这只是糟糕的编码风格吗?

    更糟。表示程序已顺利完成的正确方法是

    #include <stdlib.h>
    
    int main (void)
    {
        return EXIT_SUCCESS;
    }
    
        4
  •  1
  •   Robert Andrzejuk    5 年前

    进去?一些/很多/全部?C++实现 NULL 是一个宏扩展到 0 .

    当扩展时,它实际上给出了 return 0 。这是一个有效的返回值。

    这只是糟糕的编码风格吗?

    对。