2010-06-17 7 views
7

Quindi, se la vostra conversione da Void * a digitare * o dal tipo * a void * si dovrebbe utilizzare:Fusioni da Void * al tipo * utilizzando C++ getto stile: static_cast o reinterpret_cast

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

o

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

Per me static_cast sembra il più corretto ma ho visto entrambi utilizzati per lo stesso scopo. Inoltre, la direzione della conversione è importante. cioè deve ancora possibile utilizzare static_cast per:

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

Ho letto le altre domande sul C++ stile di fusione ma non sono ancora sicuro di quello che il modo corretto è per questo scenario (credo che sia static_cast)

risposta

7

È necessario utilizzare static_cast in modo che il puntatore venga manipolato correttamente per puntare alla posizione corretta. Tuttavia, dovresti farlo solo se hai usato il cast statico per lanciare il puntatore a void * in primo luogo. Altrimenti dovresti reinterpret_cast esattamente allo stesso tipo del puntatore originale (senza basi o simili).

0

Si dovrebbe sempre evitare reinterpret_cast, e in questo caso static_cast farà il lavoro. Non è necessario alcun cast di alcun tipo quando si converte in un puntatore void*.

+0

Allora perché hanno reinterpret_cast <>? Ci sono situazioni in cui reinterpre_cast <> dovrebbe essere usato. Le operazioni di casting possono tutte essere coperte dagli altri 3 operatori cast? –

+0

Se l'altro lato del vuoto * verrà lanciato su una classe base, sarà necessario eseguire il cast anche su quella classe base prima di assegnarla a void. –

+0

@Noah Qualche riferimento per questo? –

Problemi correlati