Приведение из Void * в TYPE * с использованием приведения в стиле C ++: static_cast или reinterpret_cast - PullRequest
7 голосов
/ 17 июня 2010

Так что если вы конвертируете из Void * в Type * или из Type * в Void *, вы должны использовать:

void func(void *p)
{
    Params *params = static_cast<Params*>(p);
}

или

void func(void *p)
{
    Params *params = reinterpret_cast<Params*>(p);
}

Мне кажется static_cast более правильнымно я видел, как оба использовались для одной цели.Также имеет значение направление конверсии.то есть я все еще должен использовать static_cast для:

_beginthread(func,0,static_cast<void*>(params)

Я читал другие вопросы о кастинге в стиле C ++, но я все еще не уверен, каков правильный путь для этого сценария (я думаю, что это static_cast)

Ответы [ 3 ]

7 голосов
/ 17 июня 2010

Вы должны использовать static_cast, чтобы правильно манипулировать указателем, чтобы он указывал на правильное местоположение. Тем не менее, вы должны делать это только в том случае, если вы использовали статическое приведение для приведения указателя к void *. В противном случае вам следует повторно интерпретировать_cast для точно такого же типа исходного указателя (без баз или тому подобного).

3 голосов
/ 17 июня 2010

Используйте static_cast с обеих сторон для этого и сохраните reinterpret_cast, когда никакая другая операция литья не будет выполнена.Следующие разделы SO предоставляют больше контекста и подробностей:

Какие формулировки в стандарте C ++ допускают static_cast(ТаНос (N));работать?

Когда использовать reinterpret_cast?

0 голосов
/ 17 июня 2010

Вы всегда должны избегать reinterpret_cast, и в этом случае static_cast выполнит эту работу.При преобразовании в указатель void* нет необходимости в каком-либо преобразовании.

...