sizeofOperatörün işleneni değerlendirilmediğinden, bunu yapabilirsiniz:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Çevrimiçi demo: http://ideone.com/S8e2Y
Diğer bir deyişle, yalnızca fkullanıldıysa işlevi tanımlamanız gerekmez sizeof. Bu teknik çoğunlukla C ++ şablon meta programlamasında kullanılır;sizeof değerlendirilmez.
Bu neden işe yarıyor? Çalışır çünkü sizeofoperatör değer üzerinde çalışmaz bunun yerine çalışır, tip ifadesinin. Bu nedenle, yazdığınızda sizeof(f()), ifadenin türü üzerinde çalışır f()ve işlevin dönüş türünden başka bir şey değildirf . İşlev, gerçekte yürütülürse hangi değeri döndürürse döndürsün her zaman aynıdır.
C ++ 'da bunu bile yapabilirsiniz:
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;
}
Yine de, sizeof ben ilk örneğini oluşturarak ediyorum, Ayazılı tarafından, A()işlevini çağırarak sonra ve fyazılı tarafından, örneğindeA().f() , ancak böyle bir şey oluyor.
Demo: http://ideone.com/egPMi
İşte diğer ilginç özelliklerini açıklayan başka bir konu sizeof: