2011-01-23 18 views

risposta

2

Non c'è differenza. È una questione di preferenza. Questi sono i cast vecchio stile

+5

-1 Questa è una informazione falsa. – Omnifarious

+0

@Charles Bailey - Ho fatto un errore. Adesso è troppo tardi per sistemarlo. Mi dispiace @ user384706. – Omnifarious

3

Non c'è praticamente alcuna differenza. Ufficialmente, il primo dice al compilatore che il valore è un numero intero. Questo probabilmente non genera alcun codice extra. La chiamata di funzione è una chiamata effettiva che esegue internamente l'altro typecast. Un compilatore intelligente ottimizzerà questo, quindi sono effettivamente gli stessi.

5

A quanto pare ho sbagliato nel mio taglio iniziale a una risposta. Sono approssimativamente equivalenti. E mentre nomi di tipi composti come long long o void * non possono utilizzare direttamente la sintassi funzionale (ad esempio, long long(val) non funziona), utilizzare typedef può aggirare questo problema.

Entrambe le annotazioni sul cast sono pessime e dovrebbero essere evitate. Ad esempio:

const char c = 'a'; 
void *fred = (void *)(&c); 

funziona, e non dovrebbe.

Sia il cast notazione di tipo C a volte si comportano come static_cast, a volte come const_cast, a volte come reinterpret_cast, o anche una combinazione dei due a seconda della situazione esatto in cui viene utilizzato. Queste semantiche sono piuttosto complesse e non è sempre facile dire esattamente cosa sta succedendo in una determinata situazione.

Ho utilizzato principalmente i cast di stile C++ static_cast<type>(val) e non uso mai cast in stile C. Basandomi sulla mia ricerca per questa domanda, smetterò anche di usare i cast in stile funzione per qualsiasi cosa. La domanda "C++ cast syntax styles" ha una risposta eccellente (quella accettata) che spiega il perché.

+2

Questo è completamente falso. 'classe A {operatore int() const; }; test int (A a) {return int (a); } 'funziona perfettamente anche se' int' non ha costruttore. Un cast di stile di funzione con un singolo parametro ha esattamente lo stesso effetto del cast equivalente in stile C. –

+0

@Charles Bailey - Ho letto di più e ho scoperto che mi sbagliavo. :-) Ho risolto la mia risposta. – Omnifarious

+0

Cast di stile funzionale con puntatori: 'typedef void * voidp; voidp fred = voidp (&c); ' –

1

Dipende da dove lo si utilizza e come. Cioè se avete valori o puntatori (o puntatori di puntatori).

Con C++ si dovrebbe leggere su * _cast <> e usarli invece.