Da der Operand des sizeof
Operators nicht ausgewertet wird, können Sie Folgendes tun:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Online-Demo: http://ideone.com/S8e2Y
Das heißt, Sie müssen die Funktion nicht definieren, f
wenn sie sizeof
nur in verwendet wird. Diese Technik wird hauptsächlich bei der Metaprogrammierung von C ++ - Vorlagen verwendet, da selbst in C ++ der Operand von sizeof
nicht ausgewertet wird.
Warum funktioniert das? Es funktioniert, weil der sizeof
Operator nicht mit dem Wert arbeitet , sondern mit dem Typ des Ausdrucks. Wenn Sie also schreiben sizeof(f())
, arbeitet es mit dem Typ des Ausdrucks f()
, der nichts anderes als der Rückgabetyp der Funktion ist f
. Der Rückgabetyp ist immer derselbe, unabhängig davon, welchen Wert die Funktion zurückgeben würde, wenn sie tatsächlich ausgeführt wird.
In C ++ können Sie sogar Folgendes tun:
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
Es sieht jedoch so aus sizeof
, als würde ich zuerst eine Instanz von erstellen A
, indem ich schreibe A()
und dann die Funktion f
für die Instanz aufrufe, indem ich schreibe A().f()
, aber so etwas passiert nicht.
Demo: http://ideone.com/egPMi
Hier ist ein weiteres Thema, das einige andere interessante Eigenschaften von erklärt sizeof
: