Зачем возвращать NULL из main ()? - PullRequest
10 голосов
/ 31 января 2020

Иногда я вижу кодеров, которые используют NULL в качестве возвращаемого значения main() в C и программах на C ++, например, что-то вроде этого:

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

Когда я компилирую это ` код с g cc Я получаю предупреждение:

предупреждение: return возвращает целое число из указателя без приведения [-Wint-преобразование]

, что разумно, поскольку макрос NULL должен быть расширен до (void*) 0, а возвращаемое значение main должно иметь тип int.

Когда я создаю короткую программу на C ++:

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

И скомпилировав его с помощью g ++, я получаю эквивалентное предупреждение:

предупреждение: преобразование в тип без указателя 'int' из NULL [-Wconversion-null]

Но почему они используют NULL в качестве возвращаемого значения main(), когда оно выдает предупреждение? Это просто плохой стиль кодирования?


  • В чем причина использования NULL вместо 0 в качестве возвращаемого значения main() несмотря на предупреждение?
  • Определено ли это реализацией, если это уместно или нет, и если да, то почему любая реализация захочет вернуть значение указателя?

Ответы [ 4 ]

14 голосов
/ 31 января 2020

, что является разумным

Да.

, поскольку макрос NULL должен быть расширен до (void*) 0

Нет. В C ++ макрос NULL не должен расширяться до (void*) 0 [support.types.nullptr]. Это может быть сделано только в C.

В любом случае, написание подобного кода вводит в заблуждение, поскольку предполагается, что NULL ссылается на константу нулевого указателя , независимо от того, как она реализована. , Использование его вместо int является логической ошибкой.

  • В чем причина использования NULL вместо 0 в качестве возвращаемого значения main() несмотря на предупреждение?

Невежество. Нет хороших причин для этого.

  • Определено ли это реализацией, если это уместно или нет, и если да, то почему любая реализация захочет получить значение указателя назад?

Нет, оно никогда не уместно . До реализации зависит, позволяет ли компилятор . Соответствующий компилятор C ++ вполне может разрешить это без предупреждения.

8 голосов
/ 31 января 2020

Когда я компилирую этот код с помощью g cc, я получаю предупреждение:

warning: return makes integer from pointer without a cast

Это потому, что вы компилируете с опциями компилятора lax. Используйте строгие C стандартные настройки -std=c11 -pedantic-errors, и вы получите ожидаемую ошибку компилятора в реализациях, где 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 голосов
/ 31 января 2020

Это просто плохой стиль кодирования?

Хуже. Правильный способ указать, что программа закончилась нормально -

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}
1 голос
/ 31 января 2020

В? Некоторых / много / все? Реализации C ++ NULL - это макрос, расширенный до 0.

. При расширении этот эффект дает return 0. Какое допустимое возвращаемое значение.

Это просто плохой стиль кодирования?

Да.

...