Mit Blick auf die Geschichte der git war es so:
%Vor% Dies war ein Workaround für historisches [C], bei dem void
und malloc()
nicht char *
, sondern void
zurückgegeben haben. Der Code wurde 2011 von Ulrich Drepper entfernt. Der Commit scheint nicht durch ein Skript oder irgendetwas automatisch erzeugt zu werden, also muss er seine Absicht haben, so zu definieren.
Die Commit-Nachricht sagt nichts über void
:
Vereinfachen Sie den malloc-Code
Entfernen Sie alle Arten von nicht verwendeten Konfigurationsoptionen und ungültigen Code.
Obwohl void
ein Schlüsselwort in C ist, werden Schlüsselwörter nicht als Präprozessorsymbole definiert. Der von Ihnen angegebene Code stellt sicher, dass er auch als Präprozessorsymbol definiert ist.
Ich weiß nicht, warum das nötig wäre.
Ich weiß nicht genau, was der Grund für die #define void void
in malloc.c
ist, aber meine Vermutung folgt:
Als Yasushi Shoji erwähnt , war void
nicht immer ein Schlüsselwort in C. Wenn es eingeführt / standardisiert wurde, Eine häufige Problemumgehung, um Code mit dem neuen Schlüsselwort void
mit Compilern kompilieren zu können, die dies nicht unterstützt haben, bestand darin, void
als Makro zu definieren, beispielsweise:
Diese Makrodefinition kann mit der Befehlszeile des Compilers anstatt über einen Header erfolgen, so dass nicht sichergestellt werden muss, dass alle Übersetzungseinheiten einen Header enthalten, der das Makro definiert.
Es kann jedoch auch vorkommen, dass Programmierer, die auf das neue Schlüsselwort migrieren, Code-Sequenzen verwenden, die folgendermaßen aussehen:
%Vor%zum Beispiel, Sie werden das folgende Bit des Codes sehen:
%Vor%in Ссылка
Ich schätze also, dass #define void void
in malloc.c
nur dazu dient, zu verhindern, dass solche Sequenzen in den darin enthaltenen Headern void
neu definieren, und dennoch zulassen, dass sie zuvor definiert wurden. ' global '(es gibt nur Kommentare in malloc.c
vor dem #define void void
), falls es in einer Konfiguration kompiliert wurde, die void
nicht unterstützt. Mit anderen Worten, wenn void
vorher nicht global als Makro definiert wurde, als malloc.c
kompiliert wurde, gab es keinen Grund, etwas später im Kompilieren etwas anderes zu definieren.
void
kann immer eine Bedeutung haben, aber ich würde sagen, void ist nicht normalerweise #define
d. Ich weiß nicht genau , was dort vor sich geht, aber die Folge dieses Code-Durchlaufs ist, dass, wenn jemand später #ifdef void
sagt, das stimmt. Mit anderen Worten, es wird nur #define
d zu void
einmal durch diesen Code-Durchlauf erhalten.