तो चलिए अपने दो कार्यों मान लें sizeof_char_array
और sizeof_int_array
कहा जाता है।
#define sizeof_array(X) \
_Generic (*(X), \
char: sizeof_char_array, \
default: sizeof_int_array) (X)
(मैं भी परीक्षण करने के लिए एक सी 11 कार्यान्वयन की जरूरत नहीं है:
सी 11 में, वहाँ एक नई सुविधा "सामान्य चयन" आप एक अपेक्षाकृत सरल मैक्रो के साथ तुम क्या चाहते करने देंगे कहा जाता है इसके खिलाफ, इतनी चेतावनी emptor!)
सी 11 से पहले, यह कभी-कभी नियमित रूप से नामित कार्यों का उपयोग करके एक मैक्रो के साथ पूरा किया गया था। आप एक मैक्रो है कि एक समारोह या अन्य किसी मैक्रो तर्क संकेत के आधार पर फोन करेगा परिभाषित कर सकते हैं:
#define sizeof_array(xtype, x) sizeof_ ## xtype ##_array(x)
int a[] = { 1, 2, 3, 4, -1 };
char b[] = "abc";
sizeof_array(int, a); /* macro expands to sizeof_int_array(a) */
sizeof_array(char, b); /* macro expands to sizeof_char_array(b) */
इनपुट तर्क सही मायने में एक सरणी है, तो आप सीधे अपने आकार की गणना करने मैक्रो का उपयोग कर सकते हैं:
#define ARRAY_SZ(x) (sizeof(x)/((void *)x == &x ? sizeof(x[0]) : 0))
एक सरणी के मामले में, निम्नलिखित अभिव्यक्ति सत्य है:
(void *)arr == &arr
क्योंकि एक सरणी का पता अपना पहला तत्व के पते के रूप में स्मृति में एक ही स्थान है।
तो, मैक्रो गणना करता है: sizeof(arr)/sizeof(arr[0])
। चूंकि sizeof
ऑपरेटर अपने तर्क के बाइट्स में आकार की रिपोर्ट करता है, इसलिए गणना की अभिव्यक्ति के परिणामस्वरूप सरणी में तत्वों की संख्या होती है। हालांकि, यदि आप लंबाई की गणना करने के लिए एक सेंटीनेल का उपयोग कर रहे हैं, तो ARRAY_SZ
मैक्रो के परिणामस्वरूप सेंटीनेल के लिए सरणी को पार करने वाली लंबाई से कम से कम एक आकार का आकार होगा।
यदि तर्क एक सरणी नहीं है, तो अभिव्यक्ति का परिणाम 0 अपवाद से विभाजित होता है।
'int size' क्या है? –
सरणी का आकार? मैं इसे स्पष्ट कर दूंगा क्योंकि यह स्पष्ट नहीं है। – Nobilis
अच्छी तरह से अगर वह हाथ से पहले सरणी के आकार को जानता है, तो वह इस तरह के सुपर फ़ंक्शन का उपयोग क्यों करेगा ताकि स्वचालित रूप से प्रकार का अनुमान लगाया जा सके और सरणी की लंबाई की गणना करने के लिए उपयुक्त फ़ंक्शन को कॉल किया जा सके? :-) –