Da der Operand des sizeofOperators 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, fwenn sie sizeofnur in verwendet wird. Diese Technik wird hauptsächlich bei der Metaprogrammierung von C ++ - Vorlagen verwendet, da selbst in C ++ der Operand von sizeofnicht ausgewertet wird.
Warum funktioniert das? Es funktioniert, weil der sizeofOperator 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 ffü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: