Sto imparando C++ da zero, e come tale non ho una conoscenza approfondita di C. In C++, non puoi lanciare un puntatore vuoto a qualsiasi cosa, e capisco le ragioni dietro a ciò. Tuttavia, lo so che in C, puoi. Quali sono le possibili ragioni per questo? Sembra proprio che sia un enorme buco nella sicurezza del tipo, che (per me) sembra una brutta cosa.Quali sono i motivi per lanciare un puntatore void?
risposta
È possibile trasmettere un void*
a un altro puntatore in entrambe le lingue. Forse intendevi implicitamente.
È molto conveniente in C non dover essere espliciti a riguardo. In C++ abbiamo i template, quindi per scrivere codice generico non è necessario il casting void*
e quant'altro. In C non c'è scelta. Un contenitore generico deve contenere void*
in oggetti, ed è molto più facile dire ripetutamente mydata* d = node;
quindi è mydata* d = (mydata*)node;
.
Quindi è praticamente come hai detto tu. In genere la sicurezza di tipo C non ha ricevuto molta enfasi come in C++, specialmente quando si trattava di void*
perché doveva essere un semplice puntatore generico a qualsiasi cosa. Non ce n'è bisogno in C++, quindi rendilo più esplicito quando hai a che fare con esso.
Un motivo: se si utilizza sort
per ordinare una matrice di strutture e si dispone di una funzione di confronto per le due strutture, è necessario eseguire il cast dei puntatori void sui puntatori alle strutture per accedere ai membri della struttura.
Quali sono i possibili motivi per [lanciare un puntatore
void *
in C]? Non è un buco gigante nella sicurezza del tipo?
È l'unico modo possibile per supportare il polimorfismo, ovvero la programmazione generica. Non c'è altro modo di fare, ad es. Una tabella hash generica. Il polimorfismo in C è selvaggiamente pericoloso, ma è l'unico polimorfismo che esiste.
Sii contento che C++ abbia un polimorfismo parametrico (una delle molte funzioni dei modelli).
- 1. Quando utilizzare un puntatore void?
- 2. Motivi per lanciare esplicitamente una NullReferenceException?
- 3. Quali sono i motivi di questo risultato di riferimento?
- 4. Quali sono alcuni motivi per cui jquery .focus() non funziona?
- 5. Quali sono i motivi per cui un sito web "semplice" non sceglie Cloud Based Hosting?
- 6. Quali sono i motivi per utilizzare l'attributo id per scopi CSS?
- 7. C++ typecast: cast un puntatore dal puntatore void al puntatore della classe
- 8. Quali sono i possibili motivi per la corruzione di file binari su dispositivi Android
- 9. Quali sono i buoni motivi per scegliere l'invarianza in un'API come Stream.reduce()?
- 10. codice errore (-11): quali sono tutti i possibili motivi per ottenere l'errore "cl_build_program_failure" in OpenCL?
- 11. Quali sono i motivi per utilizzare "syscall" invece di chiamare direttamente la funzione?
- 12. const void * puntatore nei tipi
- 13. Perché digitare cast un puntatore void?
- 14. void * è letteralmente fluttuante, come lanciare?
- 15. Che cos'è un puntatore void in C++?
- 16. Quali sono i possibili valori per CreateParams.Style?
- 17. Assegnazione dell'oggetto Objective-C in un puntatore void * con ARC
- 18. Lanciare tra il puntatore struct in C
- 19. Quali sono i motivi originali di ToString() in Java e .NET?
- 20. Quali sono i motivi "ricarica!" non sembra funzionare sempre nella console di Rails?
- 21. Quali sono i motivi validi per utilizzare un MemoryCache su una pianura vecchio dizionario <string, object>
- 22. Quali motivi avrei per non usare JRuby su MRI/YARV?
- 23. Quali potrebbero essere i motivi per cui i dati dello strumento Performance sono elevati. [che mostra in Xcode VM tracker]
- 24. Lanciare un puntatore del vuoto a una struttura
- 25. Lanciare un puntatore di struct su un altro - C
- 26. Quali sono alcuni dei motivi principali per l'aggiornamento a Visual Studio 2010? (rimanendo con .NET 3.5)
- 27. commenti di documentazione in C#: Quali sono motivi tecnici per preferire /// o/**
- 28. come lanciare un puntatore indiretta in Objective-C
- 29. Quali sono i motivi per cui l'utilizzo della CPU non va al 100% con C# e APM?
- 30. Per quali motivi dovrei usare Expression Blend su XAML Designer?
Ottima risposta, grazie! – Maulrus