Почему C ++ std IO не выводит NULL изящно?

Возможный дубликат:
Почему вывод std :: cout полностью исчезает после отправки на него значения NULL

Кажется, если вы попробуете:

 std::cout << NULL << endl;
std::cout << "hell" << endl;

он ничего не печатает и C ++ IO перестает работать для всех последующих выходных данных.

но это прекрасно работает в C stdio:

 printf("%s\n", NULL);
printf("%s\n", "hell");

(ноль)

ад

Есть ли веская причина, почему C ++ IO не может сделать то же самое?

(отредактировано в ответ на комментарии)
Хорошо, чтобы прояснить, NULL имеет тип, скажем, const char *

const char* getxxx();  // may return NULL,
cout << getxxx();      // won't work if NULL returned

3

Решение

А? Я не вижу причин, почему cout должен потерпеть неудачу просто потому, что вы казнили

std::cout << 0 << std::endl;

Должен вывести 0\n, А также оно делает. Конец истории.

(Если вы запутались, пожалуйста, знайте, что в C ++, #define NULL (0).)

Если вы написали:

T* p = 0;
std::cout << p << std::endl;

тогда он будет отображать адрес 0, (обычно в шестнадцатеричном и дополненном до размера указателя, так как это предпочтительный способ просмотра указателей).

(Это, кстати, поведение, которое вы получите, используя определение C NULL, которое #define NULL ((void*)0).)

Только если ты пишешь

char* p = 0;
std::cout << p << std::endl;

у тебя проблемы. Теперь ты звонишь

template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, const char* s);

для которого Стандарт (раздел 27.7.3.6.4) гласит:

требует: s не должен быть нулевым указателем.

Когда вы передаете нулевой указатель, применяется правило 17.6.4.9, которое гласит:

Каждое из следующих условий применимо ко всем аргументам функций, определенных в стандартной библиотеке C ++, если явно не указано иное.
* Если аргумент функции имеет недопустимое значение (например, значение вне домена функции или указатель, недопустимый для ее предполагаемого использования), поведение не определено.

Таким образом, вы находитесь в стране «неопределенного поведения». Там нет никакой гарантии, что failbit устанавливается и программа продолжается.


Обратите внимание, что printf поведение на самом деле не зависит от типа NULL, Это строка формата "%s" это вызвало обработку в виде строки (указатель на NUL-оканчивающуюся последовательность символов).

14

Другие решения

printf("%s", str) не требуется обрабатывать NULL струны, так что мимоходом NULL ты напрашиваешься на неприятности.

Семантически эквивалентный оператор с IOStreams:

std::cout << static_cast<char const*>(NULL);

И это не обязательно обрабатывать NULL Строка либо.

2

По вопросам рекламы [email protected]