glibc – #define vacío

4 minutos de lectura

Avatar de usuario de Orion
Orión

Empecé a buscar en glibc (Librería GNU) para entender cómo está escrito. En malloc.cencontré un fragmento de código de la siguiente manera:

#ifndef void
#define void        void
#endif

¿Puede alguien explicarme qué significa esto? no es void siempre definido?

Gracias

Mirando a la historia de gitera así:

/*
  Void_t* is the pointer type that malloc should say it returns
*/

#ifndef Void_t
#if (__STD_C || defined(WIN32))
#define Void_t      void
#else
#define Void_t      char
#endif
#endif /*Void_t*/

Esta fue una solución para la historia [C]que no tenía void y malloc() devuelto char * en lugar de void. Ulrich Drepper eliminó el código en 2011. El compromiso no parece ser generado por un script ni nada automático, por lo que debe tener su intención de definirlo así.

El mensaje de confirmación no dice nada sobre void:

Simplificar código malloc

Elimine todo tipo de opciones de configuración no utilizadas y código muerto.

  • Gracias por el enlace. Fue muy útil. Vi la eliminación del código anterior y todos los cambios de Void_t a voidpero #define void void todavía no tiene sentido para mí.

    – Orión

    16 de agosto de 2012 a las 3:42

  • A mi tampoco. Revisé el código glibc para ver si hay #ifdef void para hacer una compilación condicional, pero no pude encontrar ninguna. Sería mejor preguntarle a él oa la lista de correo de glibc. Pero no sé.

    – Yasushi Shoji

    16 de agosto de 2012 a las 3:47


  • Estoy extremadamente seguro de que esto es solo una parte fallida de la refactorización y puede eliminarse.

    – mirabilios

    25 de noviembre de 2021 a las 0:40

Avatar de usuario de Michael Burr
miguel rebabas

No sé con certeza cuál es la razón de la #define void void es en malloc.cpero mi conjetura sigue:

Como mencionó Yasushi Shoji, void no siempre fue una palabra clave en C. Cuando se introdujo/estandarizó, una solución común para poder compilar código usando el nuevo void palabra clave con compiladores que no la admitían era definir void como una macro como:

#define void int   /* or maybe #define void char */

esa definición de macro podría hacerse usando la línea de comando del compilador en lugar de un encabezado para que no haya necesidad de asegurarse de que todas las unidades de traducción incluyan un encabezado que defina la macro.

Sin embargo, también puede ser común que los programadores migren a la nueva palabra clave para usar secuencias de código que se parezcan a:

#ifndef void
#define void int
#endif

por ejemplo, verá el siguiente fragmento de código:

/*
 * This is a fairly bogus thing to do, but there seems to be no better way for
 * compilers that don't understand void pointers.
 */
#ifndef void
#define void char
#endif

en http://buildbot.zope.org/Squid-2.4STABLE6%2B/include/snmp_impl.h?annotate=1.1.1.1&cvsroot=Zope.org

Entonces, mi conjetura es que el #define void void en malloc.c es solo una forma de evitar que tales secuencias que puedan existir en los encabezados que incluye redefinan voidaún así permitir que se haya definido previamente ‘gloablemente’ (solo hay comentarios en malloc.c antes de #define void void) en caso de que se estuviera compilando en una configuración que no admitía void. En otras palabras, si void no se definió globalmente como una macro antes cuando malloc.c se comenzó a compilar, no había ninguna razón por la que algo debería definirse como otra cosa más adelante en la compilación.

A pesar de void es una palabra clave en C, las palabras clave no se definen como símbolos de preprocesador. El código que citó asegura que también se define como un símbolo de preprocesador.

No sé por qué esto sería necesario.

void siempre puede tener un significado, pero yo diría vacío no es normalmente #defined. No sé exactamente qué está pasando allí, pero la consecuencia de esta ejecución de código es que si alguien dice #ifdef void más adelante, será verdad. Entonces, en otras palabras, solo obtendrá #defined a void una vez por esta ejecución de código.

¿Ha sido útil esta solución?