Ho letto entrambi su questo sito e altrove, che lo stile di programmazione raccomandato per C ++ è quello di evitare l'uso di cast in stile C, e preferiamo lo stile C ++ - static_cast
, dynamic_cast
, reinterpret_cast
e const_cast
. Le ragioni di questa raccomandazione generalmente si riducono a (1) i cast di C ++ sono più sicuri perché sono più specifici e limitati nel significato e (2) sono intenzionalmente prolissi e prolissi perché non dovrebbero essere usati spesso in un buon codice C ++. Tuttavia, questo ragionamento non ha molto senso quando si tratta di chiamare le funzioni C dal mio codice C ++.
Nei miei progetti C ++ sono spesso costretto a chiamare librerie a livello di OS che hanno solo un'interfaccia C, come la libreria di socket POSIX per le operazioni di rete. Queste funzioni C spesso si aspettano che il chiamante esegua diversi cast di puntatori, e se io tengo solo i cast di C ++, il mio codice diventa goffo e prolisso. Ad esempio, il mio codice di rete è pieno di chiamate di funzioni come questa:
std::size_t message_size;
ssize_t bytes_read = recv(fd, reinterpret_cast<char*>(&message_size), sizeof(message_size), MSG_WAITALL);
Non sto ottenendo alcuna sicurezza dall'uso di cast di C ++ (dal momento che reinterpret_cast
non aggiunge realmente più controlli in fase di compilazione di un cast in stile C) e la bruttezza del codice non mi sta allertando un problema: non è possibile utilizzare le funzioni di socket senza eseguire il casting.
Alla luce della mancata corrispondenza dell'interfaccia tra C e C ++, sarebbe ragionevole usare cast in stile C quando si chiamano funzioni C che richiedono il cast? O i cast di tipo C sono sempre cattivi, e dovrei semplicemente accettare il codice in eccesso quando devo chiamare le funzioni C?