Ich fing an, mich mit glibc (GNU-Libc), um zu verstehen, wie es geschrieben ist. In malloc.c
ich 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.
Ich weiß nicht genau, was der Grund dafür ist #define void void
ist in malloc.c
aber 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 void
aber 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 #define
D. 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 #define
d zu void
einmal durch diesen Lauf des Codes.