जैसा कि sizeofऑपरेटर के संचालन का मूल्यांकन नहीं किया जाता है, आप यह कर सकते हैं:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
ऑनलाइन डेमो: http://ideone.com/S8e2Y
fयदि आपको sizeofकेवल इसका उपयोग किया जाता है, तो आपको फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है । इस तकनीक का उपयोग ज्यादातर C ++ टेम्प्लेट मेटाप्रोग्रामिंग में किया जाता है, क्योंकि C ++ में भी, के ऑपरेंड का sizeofमूल्यांकन नहीं किया जाता है।
यह काम क्यों करता है? यह काम करता है क्योंकि sizeofऑपरेटर मूल्य पर काम नहीं करता है , इसके बजाय यह अभिव्यक्ति के प्रकार पर काम करता है । इसलिए जब आप लिखते हैं sizeof(f()), तो यह अभिव्यक्ति के प्रकार पर काम करता है f(), और यह फ़ंक्शन के रिटर्न प्रकार के अलावा कुछ भी नहीं है f। रिटर्न प्रकार हमेशा एक ही होता है, इससे कोई फर्क नहीं पड़ता कि यदि वास्तव में निष्पादित होता है, तो फ़ंक्शन किस मूल्य पर लौटेगा।
C ++ में, आप यह भी कर सकते हैं:
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;
}
फिर भी ऐसा लगता है, जैसे, sizeofमैं पहली बार एक उदाहरण बना रहा हूं A, लिखकर A(), और फिर fउदाहरण पर फ़ंक्शन को कॉल करके , लिखकर A().f(), लेकिन ऐसी कोई बात नहीं होती है।
डेमो: http://ideone.com/egPMi
यहाँ एक और विषय है जो कुछ अन्य दिलचस्प गुणों के बारे में बताता है sizeof: