prepararsi per una domanda un po '"contorta" ...vuoto * come generico in C, è sicuro?
Ho implementato in passato molta struttura dati (albero, lista, tabella hash, grafico pure), usando la macro che posso implementare un po 'o generico. Comunque stavo vagando se è possibile implementare una struttura dati generica usando il puntatore vuoto, ma in qualche modo mi piacerebbe essere in grado di usare un typecheking ...
Non so se è chiaro quello che sto cercando di diciamo ... ma fondamentalmente non penso sia sempre sicuro mettere "void *" come generico, allo stesso tempo non penso sia sempre una buona idea usare la macro come modo per creare una struttura dati generica (poiché fondamentalmente ciò che fa un preprocessore con la macro è la sostituzione del codice), perché se si guardano intorno al web è possibile trovare tali esempi.
Una buona idea potrebbe essere, a mio parere ma probabilmente non ho ragione, è utilizzare la macro per creare un'interfaccia standard per i dati memorizzati in una struttura dati, tra le funzioni di interfaccia metterei il codice per il corretto tipo di controllo, dato un vuoto *. Ispirato dalla tecnica dell'ingegnere del software, questo potrebbe essere un buon modo per procedere.
È sicuramente vero che probabilmente per cose troppo sofisticate sarebbe meglio cambiare linguaggio (C++/Java) ma è anche vero che questo non è sempre possibile.
Quindi in sintesi ... come viene gestito il problema del "generico" in C? mi affido alla tua esperienza per una risposta!
È possibile utilizzare 'void *' come un puntatore generico, ma è necessario inoltre memorizzare informazioni su ciò che viene indicato, se si desidera recuperarlo effettivamente. –
Non mi è mai piaciuto 'void qsort (void * base, size_t nitems, size_t size, int (* compar) (const void *, const void *))', ma non c'è davvero niente di meglio per fare il lavoro. http://www.tutorialspoint.com/c_standard_library/c_function_qsort.htm – user3528438
non è per niente contorto. è un uso diffuso per implementare ds generici usando 'void *' per puntare a un altro blocco di dati. – HuStmpHrrr