2009-06-08 12 views
12

ich über einige Code vor kurzem kam die aussah:Warum sizeof operator mit zwei Argumenten aufrufen?

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

(wo var ein Typ ist)

Ich war ziemlich überrascht, was zu sehen erschien zwei Argumente an die sizeof Operator zu sein. Ein schneller Scan des ISO/ANSI C99-Standards ergab keine Geheimnisse. Ich konnte keine Grammatik vorlesen, die ein Komma erlaubte.

Suche Google Code, konnte ich an example dieser Syntax in einigen PPC-Code finden.

Ist das eine PPC-spezifische Syntax? Was heißt das?

EDIT: Es stellt sich heraus, dass beide, was ich suchte bei - ebenso wie der Code verknüpft - Syntax spezifisch für die WindRiver Diab compiler ist:

sizeof(type, int-const):

If int-const is 0 sizeof returns the size in bytes of type.

If int-const is 1 sizeof returns the alignment of type.

If int-const is 2 sizeof returns an integer constant designating the type of type. Look up "sizeof operator" in the Diab C/C++ User's Guide for values.

Wow, sie haben wirklich überlastet die Bedeutung des sizeof Betreibers.

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

+0

Es ist wichtig in dieser Diskussion zu erwähnen, dass "var" ein Typ ist. Weil das den Komma-Operator ausschließen würde. Aber "var" in Ihrer Frage sieht wie eine Variable aus. –

+0

Umbenannte Variable für Klarheit. Vielen Dank. –

+2

On Edit: Wow, das ist ... eine völlig unnötige Komplikation der C-Sprache. C ist kompliziert genug ... Wenn Sie die Ausrichtung sagen möchten, schreiben Sie eine alignof-Funktion oder einen Operator, wenn Sie darauf bestehen. meine Güte. (Nicht deine Schuld David, nur über schlechte Sprache Implementierer ...) –

Antwort

9

Bei weiteren Recherchen habe ich festgestellt, dass dies ein spezifisches Verhalten für die WindRiver Diab compiler ist. Bitte beachten Sie die EDIT in der Frage für Details.

+0

+1 für die Suche nach der richtigen Antwort selbst :) –

3

Es ist wie eine einfache Anwendung des comma operator mir sieht, die ihr erstes Argument ausgewertet wird, wirft das Ergebnis entfernt, wertet ihr zweites Argument.

In diesem Fall wird festgestellt, ob das Literal 2 die Größe 4 hat. Der Teil "var" ist irrelevant.

+0

Ich dachte das gleiche zuerst, aber was ist der Sinn? Und wenn das stimmt, dann würde der verknüpfte Code niemals funktionieren, oder? Das zweite Argument ist ein int-Literal, so dass seine Größe immer die Größe einer ganzen Zahl dieser Architektur hätte. –

+0

Wenn der Kommaoperator verwendet wird, wäre es nicht notwendig, das Paar in einem anderen Satz Klammern zu setzen? – veefu

+0

Punkt? Warum denkst du, dass es einen Sinn hat? –

1

Sieht aus wie ein Hering. Ich nehme an, dass Sie versehentlich den Komma-Operator verwenden und sizeof auf den letzten Wert angewendet wird.

+0

Warum wird der verknüpfte Code so geschrieben wie er ist? Hmmm .... –

+1

Eine falsche Bezeichnung? Was hat den falschen Namen? –

+1

@Rob, weil ich kein Meister der englischen Sprache bin :). Hat es zu einem roten Hering – JaredPar

0

Wie erwähnt, wird der Kommaoperator angewendet und sizeof gibt die Größe eines Integer-Literals zurück. Das sieht auf den ersten Blick wie ein Fehler des Autors aus, aber es könnte etwas finsteres Codieren passieren.

sizeof Ausdrücke werden nicht ausgewertet, so dass sie für eine Reihe von kniffligen Dingen verwendet werden können. Ein Beispiel besteht darin, eine Referenz für eine ansonsten nicht referenzierte Variable bereitzustellen, ohne dass der Compiler irgendeinen Code generiert. Unter this article zum Erstellen eines besseren Assert-Makros für ein Beispiel. Alexandrescu hat einige andere Beispiele für Tricks in Modern C++ Design, wenn Speicher dient. Es ist möglich, aber nicht wahrscheinlich, dass eine dieser nicht offensichtlichen Nutzungen beabsichtigt ist.

Unabhängig von der Verwendung, wenn es in dieser Situation nicht kommentiert ist, ist es den Wert der Lesbarkeit nicht wert und sollte geändert werden.

0

Wichtiger Haftungsausschluss: Der folgende Code ist Pseudocode. Die Argumente für sizeof werden nie wirklich ausgewertet, mit der Bedeutung von "ausgeführt", es ist immer ein Kompilierzeit Konstrukt (und daher eines der Werkzeuge von Vorlage Autoren, wie enums bevorzugt).

beachten Sie, dass ich auto unten aus C++ (0x) ausgeliehen habe; es weist den Compiler den Typ aus der initializer Ausdruck abzuleiten und macht die Beispiele ein wenig

einfacher Was viele nicht wissen ist, dass Sie sizeof gültig wie folgt aufrufen können:

auto s = sizeof int; 

Ie, kein Klammern benötigt. Deshalb, wenn man (x, y) übergeben zu sizeof, ist es gleichwertig

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

oder

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

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

auto s = sizeof y; 

So sieht es mir, dass der Compiler in Frage tut etwas wirklich, wirklich hirntot, dass sie eine Verlängerung führt, die auch auf andere Compiler kompiliert, aber mit einem völlig andere Bedeutung. Das ist schlecht.

+0

Glücklicherweise gcc und MSVC erlauben dies nicht. Code wie 'sizeof (int, 2)' ergibt einen Fehler in beiden Compilern ähnlich wie: "' error: expected ')' before ',' token' ". –

+0

Ich merke, dass meine Antwort unvollständig ist. "int" an sich ist kein auswertbarer Ausdruck; Wenn Sie 'sizeof (5,5)' schreiben, wird es kompiliert. –