Ich bin neu im Linux-Kernel. Ich lese die Datei ioctl.h
, dort bin ich auf ein Makro gestoßen
_IOC_TYPECHECK(t)
, was wie folgt aussieht:
Können Sie mir diesen Code erklären? Was bedeutet sizeof(t[1])
in diesem Code?
Dies wird verwendet, um die Gültigkeit des dritten Parameters für die Makros _IOR
/ _IOW
/ _IOWR
zu prüfen, die ein Typ sein soll. Es überprüft, dass der Parameter tatsächlich ein Typ (und keine Variable oder eine Zahl) ist und andernfalls einen Compiler- oder Linkfehler verursacht.
Wenn t
ein Typ ist, dann ist t[1]
der Typ "ein Array von 1 t
". Dieser Typ hat dieselbe Größe wie t
und daher ist sizeof(t) == sizeof(t[1])
wahr.
Wenn t
eine Zahl ist, wird sizeof(t)
nicht kompiliert.
Wenn t
eine einfache (Nicht-Array-) Variable ist, verursacht t[1]
einen Compilerfehler.
Wenn t
eine Array-Variable ist, wird sizeof(t) == sizeof(t[1])
falsch sein, und ein Linker-Fehler wird verursacht (weil __invalid_size_argument_for_IOC
nicht definiert ist).
Der Ausdruck sizeof(t) < (1 << _IOC_SIZEBITS)
prüft, dass die Größe des Typs t
das für ioctl
zulässige Maximum nicht überschreitet und sonst den gleichen Linker-Fehler verursacht.
Es gibt noch einige ungültige Fälle, die von diesem Makro nicht erfasst werden - zum Beispiel, wenn t
ein Zeiger auf einen Zeiger ist.
Es bedeutet dasselbe wie alle anderen Verwendungen von sizeof
. Es berechnet die Größe des Ausdrucks.
In diesem speziellen Fall vermute ich, dass die Überprüfung eine Eigenschaft von t
sicherstellen soll (die ein Typname sein sollte, keine Variable), die ich aus dem Kontext nicht kenne ... Vielleicht, dass es das ist Es ist möglich, es als einen Zeiger (benötigt für die Array-Indizierung) zu behandeln, der einige Typen ausschließen würde. Der Kommentar neben dem Makro sagt /* provoke compile error for invalid uses of size argument */
, was diese Theorie zu unterstützen scheint.
Beachten Sie, dass sizeof
ein Operator und keine Funktion ist. Die Klammern werden nicht benötigt, es sei denn, Sie möchten die Größe eines Typs direkt berechnen und sind dann Teil des Ausdrucks (es handelt sich um einen Cast-Ausdruck). Also könnte dies geschrieben werden sizeof t == sizeof t[1] && ...
, oder vielleicht (sizeof t == sizeof t[1])
für die Klarheit.
Dies ist ein sehr guter Stil, da er die Größe, die berechnet wird, an das richtige Array "sperrt", anstatt den Typ von t
zu wiederholen. Wenn sich der Typ also ändert, passt sich der Ausdruck automatisch an und berechnet immer noch das Richtige.
Viele C-Programmierer scheinen aus irgendeinem Grund in allen Fällen Klammern um das Argument zu sizeof
zu haben.
Tags und Links macros c linux-kernel sizeof