glibc - #define void

8

Ich habe angefangen, glibc ( GNU Libc ) zu betrachten. zu verstehen, wie es geschrieben ist. In malloc.c habe ich einen Code wie folgt gefunden:

%Vor%

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

Danke

    
Orion 16.08.2012, 02:57
quelle

4 Antworten

7

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 :

aus
  

Vereinfachen Sie den malloc-Code

     

Entfernen Sie alle Arten von nicht verwendeten Konfigurationsoptionen und ungültigen Code.

    
Yasushi Shoji 16.08.2012, 03:26
quelle
4

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.

    
Greg Hewgill 16.08.2012 03:00
quelle
3

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:

%Vor%

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.

    
Michael Burr 16.08.2012 06:47
quelle
0

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.

    
sblom 16.08.2012 03:00
quelle

Tags und Links