GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Implementierung des sizeof-Operators

Der sizeof -Operator ist Teil der C- (und C++)-Sprachspezifikation und wird im Compiler (dem Front-End) implementiert. Es gibt keine Möglichkeit, es mit anderen C-Konstrukten zu implementieren (es sei denn, Sie verwenden GCC-Erweiterungen wie typeof), da es entweder Typen oder Ausdrücke als Operanden akzeptieren kann, ohne Nebeneffekte (z. B. sizeof((i>1)?i:(1/i)) stürzt nicht ab, wenn i==0 aber Ihr Makro my_sizeof würde bei einer Division durch Null abstürzen). Siehe auch C-Codierungsrichtlinien und Wikipedia.

Sie sollten C-Zeiger-Arithmetik verstehen. Siehe z.B. diese Frage. Die Zeigerdifferenz wird in Elementen und nicht in Bytes ausgedrückt.


Das Ergebnis der Zeigersubtraktion liegt in Elementen vor und nicht in Byte. Somit ergibt der erste Ausdruck 1 per Definition.

Abgesehen davon sollten Sie in Makros wirklich Klammern verwenden:

#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)

Andernfalls versuchen Sie, my_sizeof() zu verwenden in einem Ausdruck kann zu Fehlern führen.


Linux
  1. Bash-Scripting:Wechsel vom Backtick-Operator zu $-Klammern

  2. -eq:Unärer Operator erwartet?

  3. 7 Beispiele für leistungsstarke Awk-Operatoren (Unäre, Binäre, Arithmetische, String-, Zuweisungs-, Bedingungs-, Reg-Ex-Awk-Operatoren)

  4. 7 Beispiele für Linux-Operatoren Grep OR, Grep AND, Grep NOT

  5. Linux-AuFS-Beispiele:Ein weiteres Tutorial zum Union-Dateisystem (UnionFS-Implementierung)

Behebung „Implementierung des USB 2.0-Controllers nicht gefunden!“ VirtualBox-Fehler

So erstellen Sie ein TLS/SSL-Zertifikat mit einem Cert-Manager-Operator auf OpenShift

Implementierung von Bedingungsvariablen

Ist der Zugriff auf den Heap serialisiert?

Air-Gap-Implementierung für die Verwendung von Personalcomputern

Was ist die kleinstmögliche Linux-Implementierung?