2016-10-21 6 views
3

Von Linux-Kernel-CodePlatz #define in Struktur

struct gpio_desc { 
    struct gpio_chip *chip; 
    unsigned long  flags; 
/* flag symbols are bit numbers */ 
#define FLAG_REQUESTED 0 
#define FLAG_IS_OUT 1 
#define FLAG_EXPORT 2 /* protected by sysfs_lock */ 
#define FLAG_SYSFS 3 /* exported via /sys/class/gpio/control */ 
#define FLAG_ACTIVE_LOW 6 /* value has active low */ 
#define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ 
#define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ 
#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ 
#define FLAG_IS_HOGGED 11 /* GPIO is hogged */ 

    /* Connection label */ 
    const char  *label; 
    /* Name of the GPIO */ 
    const char  *name; 
}; 

was ist der Grund, um Platz in den Körper der Struktur definiert?

+1

Was ist daran falsch? Vielleicht, um die Konstanten in der Nähe zu haben, wo sie benutzt werden. – Olaf

+1

Das ist in Ordnung, denke ich, wenn die Struktur nur ein Feld hat, das '# definiert' braucht. Scheint so, als ob die Strukturdefinition ein Chaos wäre, wenn Sie ein halbes Dutzend Felder mit jeweils 10 Definitionen hätten. – user3386109

Antwort

5

Mit #define spielt es keine Rolle, wo Sie sie hinstellen (so lange es in der Datei höher ist als dort, wo es zuerst verwendet wird). Höchstwahrscheinlich werden diese Konstanten nur innerhalb dieser Struktur verwendet, also wurde sie dort so logisch platziert, dass sie einfacher zu finden sind. Sie konnten irgendwo über den ersten Platz gelegt werden, an dem sie benutzt wurden, aber sie wurden wegen ähnlichen Zwecks zusammen gruppiert.

+3

Ich denke, es ist nur zu Sel-Dokumentieren der 'Flags'-Feld. –

2

Es ist bedeutungslos, außer zu versuchen, sie nahe dem Punkt der ersten Verwendung zu definieren.

Wenn der Compiler tatsächlich den Code sieht, hat der Präprozessor diese Zeilen entfernt.

In diesem speziellen Beispiel wären sie besser mit einer typedef-Enumeration für die Flags ausgestattet und verwenden diese enum, um das Feld zu deklarieren.

+1

'# define' ist oft vorzuziehen gegenüber' enum'. Zum Beispiel, wenn der numerische Wert für irgendeine Art von Berechnung verwendet wird. –

+0

Nur wenn diese Berechnungen in Präprozessordirektiven enthalten sind. Überall wandelt enum leise in int (in C) um. – kdopen

+1

Nicht leise. Sie erhalten Warnungen, die sagen, dass der Typ "enum" mit einem anderen Typ gemischt ist. –

0

Es gibt keine Auswirkungen. Aber in dem Beispiel, um der Lesbarkeit willen haben sie in der Nähe der deklarierten Variablen gehalten/hinzugefügt.

Sie wollen diese "#define" für die Variable "unsigned long flags;" verwenden.

Unten ist ein einfaches Beispiel und beweist keinen Einfluss auf die Klasse/Struktur, indem das "#Definieren" innen deklariert.

//gcc 4.9.3 

#include <stdio.h> 

struct gpio_desc { 

#define FLAG_REQUESTED 0 

} test; 

int main() 
{ 
    printf("%d",FLAG_REQUESTED); 
} 

Der Ausgang ist Null.

+1

Dies ist eine Frage zu C, nicht zu C++. Ihr Beispiel verwendet einen C++ - Header und erstellt eine leere Struktur, die in C nicht erlaubt ist (obwohl es zulässig ist, eine leere Klasse in C++ zu erstellen) und C++ - I/O verwendet. Alles zusammen ergibt eine unangemessene Antwort für eine C-Frage. –

+0

Der Code wurde geändert – Naidu

+0

@ Jonathan Der obige Code ist in gcc 4.9.3 erlaubt. Ich meine leere Struktur. Versuchen Sie es hier http://rextester.com/l/c_online_compiler_gcc – Naidu