Какова цель этого возвращаемого значения? - PullRequest
0 голосов
/ 16 июля 2011

Я столкнулся с кодом, на который не смог найти ответ в Google или SO.Я смотрю на функцию потока, которая возвращает void *, как вы могли ожидать.Однако, прежде чем функция потока завершается, он внезапно выполняет этот трюк,

return (void*) 0;

Какова цель этого?Я не могу понять это.

edit:

Поняв, что это то же самое, что и NULL - я думаю, они использовали это, чтобы пропустить, включая stdlib

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

(void*)0 - это нулевой указатель, он же NULL (который на самом деле является макросом, определенным в нескольких заголовочных файлах, например, stddef.h или stdio.h, что в основном равнозначно (void*)0).

Обновление:

Как объяснить нулевые указатели и их полезность?По сути, это специальное значение, которое говорит: «Этот указатель нигде не указывает» или «Этот указатель не установлен на допустимую ссылку на объект».

Историческая справка: Тони Хоар, который, как говорят,изобрел нулевые ссылки в 1965 году, как известно, сожалеет об этом изобретении и поэтому называет его «Ошибка в миллиард долларов» :

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

0 голосов
/ 16 июля 2011

Ну, я не встречал ни одного компилятора C ++, говорящего, что NULL или 0 нельзя преобразовать в void* (или в / из int*, например). Но могут быть некоторые умные компиляторы или инструменты статического анализа, которые сообщат о преобразовании 0 to void-pointer в качестве предупреждения.

Этот оператор обычно встречается в реализации обратного вызова (например, подпрограмма потока), которая должна соответствовать требуемому прототипу обратного вызова (pthread_create, CreateThread и т. Д.). Поэтому, когда вы реализуете эту функцию, вы должны вернуть тот же тип, для которого она была запрошена. Для pthread_create рутины вы должны вернуть void* - и именно поэтому return (void*)0; есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...