glibc – #define void

Lesezeit: 3 Minuten

Benutzeravatar von Orion
Orion

Ich fing an, mich mit glibc (GNU-Libc), um zu verstehen, wie es geschrieben ist. In malloc.cich habe ein Stück Code wie folgt gefunden:

#ifndef void
#define void        void
#endif

Kann mir bitte jemand erklären was das bedeutet? Ist nicht void immer definiert?

Danke

Anschauen die Git-Geschichtees war so:

/*
  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*/

Dies war eine Problemumgehung für historische [C]die nicht hatte void Und malloc() ist zurückgekommen char * anstatt void. Der Code wurde 2011 von Ulrich Drepper entfernt. Der Commit scheint nicht durch ein Skript oder irgendetwas Automatisches generiert zu werden, also muss er seine Absicht gehabt haben, dies so zu definieren.

Die Commit-Nachricht sagt nichts darüber aus void:

Malloc-Code vereinfachen

Entfernen Sie alle Arten von ungenutzten Konfigurationsoptionen und totem Code.

  • Danke für den Link. Es war sehr hilfreich. Ich sah das Entfernen des obigen Codes und alle Änderungen aus Void_t Zu voidAber #define void void macht für mich immer noch keinen sinn.

    – Orion

    16. August 2012 um 3:42 Uhr

  • Mir geht es auch nicht. Ich habe den glibc-Code überprüft, um zu sehen, ob es einen gibt #ifdef void um eine bedingte Kompilierung zu machen, aber ich konnte keine finden. Es könnte besser sein, ihn einfach zu fragen oder auf die glibc-Mailingliste zu gehen. Aber ich weiß es nicht.

    – Yasushi-Shoji

    16. August 2012 um 3:47 Uhr


  • Ich bin mir sehr sicher, dass dies nur ein verpfuschter Teil der Umgestaltung ist und einfach entfernt werden kann.

    – mirabilos

    25. November 2021 um 0:40 Uhr

Benutzeravatar von Michael Burr
Michael Burr

Ich weiß nicht genau, was der Grund dafür ist #define void void ist in malloc.caber meine Vermutung folgt:

Wie Yasushi Shoji erwähnte, void war nicht immer ein Schlüsselwort in C. Als es eingeführt/standardisiert wurde, war es eine gängige Problemumgehung, um Code mit dem neuen kompilieren zu können void Schlüsselwort mit Compilern, die es nicht unterstützten, war zu define void als Makro wie:

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

Diese Makrodefinition könnte über die Compiler-Befehlszeile statt über einen Header erfolgen, sodass nicht sichergestellt werden müsste, dass alle Übersetzungseinheiten einen Header enthalten, der das Makro definiert.

Es kann jedoch auch üblich sein, dass Programmierer, die auf das neue Schlüsselwort migrieren, Codesequenzen verwenden, die wie folgt aussehen:

#ifndef void
#define void int
#endif

Beispielsweise sehen Sie den folgenden Codeabschnitt:

/*
 * 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

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

Also, meine Vermutung ist, dass die #define void void In malloc.c ist nur eine Möglichkeit, um zu verhindern, dass solche Sequenzen, die möglicherweise in den darin enthaltenen Headern vorhanden sind, neu definiert werden voidaber immer noch erlauben, dass es zuvor “gloably” definiert wurde (es gibt nur Kommentare in malloc.c Vor dem #define void void), falls es auf einer Konfiguration kompiliert wurde, die dies nicht unterstützte void. Mit anderen Worten, wenn void war vorher nicht global als Makro definiert malloc.c zu kompilieren begonnen wurde, gab es keinen Grund, etwas später in der Kompilierung als etwas anderes zu definieren.

Obwohl void ein Schlüsselwort in C ist, Schlüsselwörter sind nicht als Präprozessorsymbole definiert. Der von Ihnen zitierte Code stellt sicher, dass er auch als Präprozessorsymbol definiert ist.

Ich wüsste nicht, warum das nötig wäre.

void kann immer eine Bedeutung haben, aber ich würde sagen, nichtig ist nicht normalerweise #defineD. Ich weiß nicht Exakt was dort vor sich geht, aber die Folge dieses Codelaufs ist, dass wenn irgendjemand sagt #ifdef void später wird es wahr sein. Mit anderen Worten, es wird nur bekommen #defined zu void einmal durch diesen Lauf des Codes.

1443640cookie-checkglibc – #define void

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy