13 Stimmen

Warum wird der sizeof-Operator mit zwei Argumenten aufgerufen?

Kürzlich bin ich auf einen Code gestoßen, der so aussah:

if(sizeof(var,2) == 4) { ... }

(wobei var ist ein Typ)

Ich war ziemlich überrascht, als ich sah, dass es offenbar zwei Argumente für die sizeof Betreiber. Ein kurzer Blick in die ISO/ANSI-Norm C99 ergab keine Geheimnisse. Ich konnte keine Lesart der Grammatik finden, die ein Komma an dieser Stelle zulässt.

Bei der Suche nach Google Code konnte ich Folgendes finden ein Beispiel dieser Syntax in einigen PPC-Codes.

Ist das eine PPC-spezifische Syntax? Was bedeutet sie?

EDITAR: Es stellt sich heraus, dass sowohl das, was ich mir angesehen habe, als auch der verlinkte Code eine spezifische Syntax für die WindRiver Diab Compiler :

Größe von (Typ, int-const):

Wenn int-const 0 ist Größe von gibt die Größe des Typs in Bytes zurück.

Wenn int-const gleich 1 ist Größe von gibt die Ausrichtung des Typs zurück.

Wenn int-const gleich 2 ist Größe von gibt eine ganzzahlige Konstante zurück, die den Typ von type. Schlagen Sie "sizeof operator" in der Diab C/C++ Benutzerhandbuch für Werte.

Wow, sie haben wirklich die Bedeutung des Wortes sizeof Betreiber.

EDIT2: Die vollständige Dokumentation finden Sie hier: http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

10voto

David Citron Punkte 42229

Bei weiteren Nachforschungen fand ich heraus, dass dies ein spezifisches Verhalten der WindRiver Diab Compiler . Bitte beachten Sie die EDIT in der Frage für Details.

1voto

JaredPar Punkte 699699

Sieht nach einem Ablenkungsmanöver aus. Meine Vermutung ist, dass Sie versehentlich den Komma-Operator verwenden und sizeof auf den letzten Wert angewendet wird.

0voto

Dan Olson Punkte 21991

Wie bereits erwähnt, wird der Komma-Operator angewendet und sizeof gibt die Größe eines Integer-Literal zurück. Auf den ersten Blick sieht dies wie ein Fehler des Autors aus, aber es könnte auch eine unheilvolle Kodierung vorliegen.

sizeof-Ausdrücke werden nicht ausgewertet, so dass sie für eine Reihe von kniffligen Dingen verwendet werden können. Ein Beispiel ist die Bereitstellung eines Verweises für eine ansonsten nicht referenzierte Variable, ohne dass der Compiler irgendeinen Code generieren muss. Siehe dieser Artikel zur Erstellung eines besseren Assert-Makros für ein Beispiel. Alexandrescu hat in Modern C++ Design einige andere Beispiele für sizeof-Tricksereien, wenn ich mich recht erinnere. Es ist möglich, aber nicht wahrscheinlich, dass eine dieser nicht offensichtlichen Verwendungen beabsichtigt ist.

Wie auch immer die Verwendung ist, wenn sie in dieser Situation nicht kommentiert wird, dann ist sie den Kompromiss in Bezug auf die Lesbarkeit eindeutig nicht wert und sollte geändert werden.

0voto

Sebastian Mach Punkte 37301

Wichtiger Hinweis: Der nachstehende Code ist Pseudocode. Die die Argumente für sizeof werden nie ausgewertet Mit der Bedeutung "ausgeführt" ist es immer ein Konstrukt zur Kompilierzeit (und daher eines der von Vorlagenautoren bevorzugten Werkzeuge, wie Enums).

Anmerkung: Ich habe mir auto unten aus C++ (0x); sie weist den Compiler an, den Typ aus dem Initialisierungsausdruck abzuleiten und macht die Beispiele etwas einfacher

Was viele nicht wissen, ist, dass man sich auf sizeof gültig wie diese:

auto s = sizeof int;

Das heißt, es werden keine Klammern benötigt. Wenn Sie also (x,y) an sizeof ist sie gleichbedeutend mit

auto c = (x,y);
auto s = sizeof c;

oder einfach

auto c = x,y;
auto s = sizeof c;

x,y ist eine Sequenz, bei der jeder Teil von links nach rechts ausgewertet wird, und die Sequenz erhält den Wert des letzten Teils, in diesem Fall ist dies y . Der ursprüngliche Code entspricht also in etwa Folgendem

auto s = sizeof y;

Für mich sieht es also so aus, als ob der betreffende Compiler etwas sehr, sehr Hirnloses tut, indem er eine Erweiterung einführt, die auch auf anderen Compilern kompiliert, aber mit einer völlig anderen Bedeutung. Das ist schlecht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X