2010-04-07 10 views
6

Estoy aprendiendo C++ desde cero, y como tal no tengo una comprensión experta de C. En C++, no se puede convertir un puntero nulo en lo que sea, y entiendo las razones detrás de eso. Sin embargo, sé que en C, puedes. ¿Cuáles son las posibles razones para esto? Parece que es un gran agujero en la seguridad del tipo, lo que (para mí) parece algo malo.¿Cuáles son las razones para emitir un puntero vacío?

Respuesta

13

Puede convertir void* en otro puntero en ambos languages. Quizás quisiste decir implícitamente.

Es muy conveniente en C no tener que ser explícito al respecto. En C++ tenemos plantillas, por lo que para escribir código genérico no hay necesidad de fundición void* y otras cosas. En C no hay otra opción. Un contenedor genérico tiene que contener void* a los objetos, y es mucho más fácil decir repetidamente mydata* d = node;, entonces es mydata* d = (mydata*)node;.

Así que es más o menos como dijiste. En C, la seguridad en general no recibió tanto énfasis como lo hizo en C++, especialmente cuando se trataba de void* porque se suponía que era un simple indicador genérico de lo que sea. No hay necesidad de eso en C++, así que mejor explícalo cuando lo estés tratando.

+0

¡Gran respuesta, gracias! – Maulrus

0

Una razón: si usa sort para ordenar una matriz de estructuras, y tiene una función de comparación para las dos estructuras, necesitará convertir los punteros vacíos en punteros a las estructuras para acceder a los miembros de la estructura.

1

¿Cuáles son las posibles razones para [emitir un puntero void * en C]? ¿No es este un agujero gigante en seguridad tipo?

Es la única forma posible de admitir el polimorfismo, también conocido como programación genérica. No hay otra forma de hacer, por ejemplo, una tabla hash genérica. El polimorfismo en C es tremendamente inseguro, pero es el único polimorfismo que existe.

Se alegra que C++ tenga polimorfismo paramétrico (una de las muchas funciones de las plantillas).

Cuestiones relacionadas