2010-06-17 3 views
7

Так что, если ваше преобразование из Пустоты * к типу * или от типа * к мочеиспусканию * Вы должны использовать:Cast от Пустоты * до TYPE * с помощью C++ стиля ролей: static_cast или reinterpret_cast

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)

ответ

7

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

0

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

+0

Так почему reinterpret_cast <>? Существуют ли ситуации, в которых следует использовать reinterpre_cast <>. Могут ли все операции литья быть охвачены другими 3 операциями литья? –

+0

Если другая сторона void * будет применена к базовому классу, вам необходимо также передать этот базовый класс перед присвоением void. –

+0

@Noah Некоторая ссылка для этого? – 2010-06-17 19:27:00