2010-11-30 9 views
0

bitte jemand mir helfen kann, sizeof() Operator in c zu implementieren ..sizeof Operator in c

Ich kenne die Nutzung .. aber ich war nicht in der Lage, sie umzusetzen.

+2

Was haben Sie versucht? Wo steckst du fest? Haben Sie Fehler? Schreibst du einen Compiler? –

+0

Nein .. eigentlich werde ich das Verhalten des Operators sizeof implementieren – RJV

+0

zum Beispiel, wenn sizeof ('t') den Ausgang ist 1 – RJV

Antwort

10

Sie können nicht sizeof() als Bibliotheksfunktion implementieren, ist es ein intrinsischer Compiler. Schreibst du einen Compiler?

+0

zum Beispiel, wenn sizeof ('t') den output ist 1 – RJV

+6

@RAVI JV: Es ist unwahrscheinlich, dass das Ergebnis von 'sizeof ('t')' '1' auf Ihrem Computer ist, weil eine Zeichenkonstante vom Typ 'int ist 'in C, nicht' char' (ja, 'int' _could_ kann ein Byte groß sein, wenn ein Byte mindestens 16 Bit hat; es ist nur unwahrscheinlich, dass Sie ein System haben, wo dies der Fall ist). –

+0

@James Bist du dir da sicher? Ich bin mir ziemlich sicher, dass 't' vom Typ char sein wird, der garantiert 8 Bytes lang ist ... –

1

Sie können nicht sizeof in C umzusetzen; Es ist ein Basisoperator (Sie können auch + nicht implementieren).

Sie einen Makro schreiben könnten, die eine begrenzte Teilmenge von sizeof ‚s Verhalten hat, durch etwas entlang der Linien zu tun:

#define thisIsAHorribleHackDontDoThis(a) \ 
    ((size_t)((intptr_t)(&a + 1) - (intptr_t)&a)) 

aber das funktioniert nur, wenn a ein L-Wert (und es ist schrecklich zu sehen). sizeof ist nicht so begrenzt, und deshalb sollten Sie es verwenden, anstatt ein Rad neu zu erfinden, das nicht wirklich rund ist.

+1

Oder '#define mysizeof (type) ((size_t) ((char *) ((typ *) 0 + 1) - (char *) 0))' –

+0

@R: man sollte beide Ansätze als "Maximum" mischen tragbar". 'intptr_t' ist nicht unbedingt definiert, aber' (char *) (void *) & a' ist. Auf der anderen Seite, wenn ich mich richtig erinnere, ist Arithmetik auf Nullzeiger UB. –

-2

Unten ist die Implementierung von sizeof Betreiber

#define SZOF(x) (size_t)(((x*)(0))+1) 
+0

das funktioniert nur für einige * type * x; sizeof funktioniert auch mit Variablennamen. Auch das ist ziemlich genau dasselbe wie R.'s Kommentar zu Stephen Canons Antwort oben. –