Я иногда вижу кодеров, которые используют в NULL
качестве возвращаемого значения в программах main()
на C и C ++, например что-то вроде этого:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Когда я компилирую этот код с помощью gcc, я получаю предупреждение:
предупреждение: возвращение делает целое число из указателя без приведения [-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()
несмотря на предупреждение? - Определено ли это реализацией, если это уместно или нет, и если да, то почему любая реализация захочет вернуть значение указателя?
EXIT_FAILURE
это 8, и, похоже, использование 1 не годится для сбоя, поскольку иногда оно используется в некоторых программах как успех.NULL
указатель как0
(без приведения кvoid *
). В этом случае недостаток остается незамеченным и не выдает предупреждение. Это все еще не то, для чего следует использовать NULL.Ответы:
Да.
Нет. В C ++ макрос
NULL
не должен расширяться до(void*) 0
[support.types.nullptr]. Это может быть сделано только в C.В любом случае, написание подобного кода вводит в заблуждение, поскольку
NULL
предполагается, что оно ссылается на константу нулевого указателя , независимо от того, как она реализована. Использование его вместоint
логической ошибки.Невежество. Нет веских причин для этого.
Нет, это никогда не подходит . От реализации зависит, позволяет ли это компилятор . Соответствующий компилятор C ++ вполне может разрешить это без предупреждения.
источник
Это потому, что вы компилируете с опциями компилятора lax. Используйте строгие стандартные настройки языка Си,
-std=c11 -pedantic-errors
и вы получите ожидаемую ошибку компилятора в реализациях, гдеNULL
расширяется до константы нулевого указателя(void*)0
. Смотрите «Указатель из целого числа / целое число из указателя без приведения» .В реализациях, где происходит
NULL
расширение0
, код строго соответствует стандарту, но очень плохой стиль, непереносим и хуже всего: полная ерунда.На C ++ 11 и выше
NULL
не должен использоваться - вместо этого используйтеnullptr
. Возвращать его из main () неверно независимо.NULL
всегда расширяется до0
C ++, так что строго говоря, это будет работать, но это очень плохой стиль и, что хуже всего: полная ерунда.Не просто плохой, но бессмысленный стиль кодирования без какого-либо обоснования. Программист, который написал это, был некомпетентен.
источник
Хуже. Правильный способ указать, что программа закончилась нормально
источник
exit()
(или возвращаемое значение 0 из main) означает то же самое, что иEXIT_SUCCESS
.return
изmain
. Итак, более «правильная» версия вашей программыint main(void){}
;-)В «некоторые / многие / все» Реализации C ++
NULL
- это макрос, расширенный до0
.Это при расширении в силу дает
return 0
. Который является допустимым возвращаемым значением.Да.
источник