sizeof
Operatö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 f
kullanı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ü sizeof
operatö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, A
yazılı tarafından, A()
işlevini çağırarak sonra ve f
yazı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
: