जैसा कि 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
: