¿Por qué vacío en C significa no vacío?

Pregunta:

En lenguajes fuertemente tipados como Java y C #, void (o Void ) como tipo de retorno para un método parece significar:

Este método no devuelve nada. Nada. Sin retorno. No recibirá nada de este método.

Lo que es realmente extraño es que en C, void como tipo de retorno o incluso como tipo de parámetro de método significa:

Realmente podría ser cualquier cosa. Tendría que leer el código fuente para averiguarlo. Buena suerte. Si es un puntero, realmente debería saber lo que está haciendo.

Considere los siguientes ejemplos en C:

void describe(void *thing)
{
    Object *obj = thing;
    printf("%s.\n", obj->description);
}

void *move(void *location, Direction direction)
{
    void *next = NULL;

    // logic!

    return next;
}

Obviamente, el segundo método devuelve un puntero, que por definición podría ser cualquier cosa.

Dado que C es más antiguo que Java y C #, ¿por qué estos lenguajes adoptaron void como "nada" mientras que C lo usó como "nada ni nada (cuando es un puntero)"?

Respuesta:

La palabra clave void (no un puntero) significa "nada" en esos idiomas. Esto es consistente.

Como notó, void* significa "puntero a cualquier cosa" en lenguajes que admiten punteros sin formato (C y C ++). Esta es una decisión desafortunada porque, como mencionaste, hace que void signifique dos cosas diferentes.

No he podido encontrar la razón histórica detrás de la reutilización de void para significar "nada" y "cualquier cosa" en diferentes contextos, sin embargo, C hace esto en varios otros lugares. Por ejemplo, la static tiene diferentes propósitos en diferentes contextos. Obviamente, existe un precedente en el lenguaje C para reutilizar palabras clave de esta manera, independientemente de lo que uno pueda pensar de la práctica.

Java y C # son lo suficientemente diferentes como para hacer una ruptura clara para corregir algunos de estos problemas. Java y "seguro" C # también no permiten punteros primas y no necesitan fácil compatibilidad C (inseguro C # permite punteros, pero la gran mayoría de código C # no entran en esta categoría). Esto les permite cambiar un poco las cosas sin preocuparse por la compatibilidad con versiones anteriores. Una forma de hacer esto es introducir un Object clase en la raíz de la jerarquía de la que heredan todas las clases, por lo que una referencia de Object cumple la misma función de void* sin la maldad de los problemas de tipos y la gestión de la memoria en bruto.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım