आप मैक्रो के रूप में पहली बार लागू कर सकते हैं:
#define incr(x) (++(x))
बेशक
, इस अप्रिय दुष्प्रभाव हो सकते हैं अगर आप सावधान नहीं कर रहे हैं। यह एकमात्र विधि सी के बारे में है, हालांकि विभिन्न प्रकार के किसी भी प्रकार के लिए एक ही ऑपरेशन को लागू करने के लिए प्रदान करता है। विशेष रूप से, चूंकि संकलक टेक्स्ट प्रतिस्थापन का उपयोग करके लागू किया जाता है, जब तक संकलक इसे देखता है, आपके पास केवल शाब्दिक कोड ++whatever;
होता है, और यह आपके द्वारा प्रदान किए गए आइटम के प्रकार के लिए ++
लागू कर सकता है। शून्य के लिए एक सूचक के साथ, आप वास्तविक प्रकार के बारे में ज्यादा (यदि कुछ भी) नहीं जानते हैं, तो आप उस डेटा पर अधिक प्रत्यक्ष हेरफेर नहीं कर सकते हैं)।
void *
आमतौर पर तब उपयोग किया जाता है जब प्रश्न में कार्य को वास्तव में शामिल डेटा के सटीक प्रकार को जानने की आवश्यकता नहीं होती है। कुछ मामलों में (उदा।, qsort
) यह डेटा के किसी भी विवरण को जानने से बचने के लिए कॉलबैक फ़ंक्शन का उपयोग करता है।
चूंकि यह दोनों प्रकार और स्वैप करता है, चलिए थोड़ी अधिक विस्तार से qsort देखें। इसके हस्ताक्षर है:
void qsort(void *base, size_t nmemb, size_t size,
int(*cmp)(void const *, void const *));
तो, पहले void *
आप के बारे में पूछा है - डेटा के लिए सूचक क्रमबद्ध करना। दूसरा सरणी में तत्वों की संख्या qsort बताता है। तीसरा, सरणी में प्रत्येक तत्व का आकार। अंतिम एक फ़ंक्शन के लिए एक सूचक है जो अलग-अलग वस्तुओं की तुलना कर सकता है, इसलिए qsort
को यह जानने की आवश्यकता नहीं है कि यह कैसे करें। उदाहरण के लिए, कहीं qsort अंदर जैसे कुछ कोड कुछ हो जाएगा: दो आइटम स्वैप करने के लिए,
// if (base[j] < base[i]) ...
if (cmp((char *)base+i, (char *)base+j) == -1)
इसी तरह, यह सामान्य रूप से अस्थायी भंडारण के लिए एक स्थानीय सरणी होगा। यह तो array[j]
से array[i]
को और अंत में temp
से array[j]
करने के लिए अपने अस्थायी करने array[i]
से बाइट्स कॉपी कर देंगे, तो:
char temp[size];
memcpy(temp, (char *)base+i, size); // temp = base[i]
memcpy((char *)base+i, (char *)base+j, size); // base[i] = base[j]
memcpy((char *)base+j, temp, size); // base[j] = temp
क्या सी ++ में अभिन्न प्रकारों के लिए पोस्टफिक्स वृद्धि है? आप इसे फिर से परिभाषित क्यों करना चाहते हैं? – Yola
सी 11 में आप '_Generic' का उपयोग कर सकते हैं: http://www.robertgamble.net/2012/01/c11-generic-selections.html –
@Yola: यह सिर्फ एक डेमो है .. असल में मुझे बहुत कुछ करना पड़ सकता है मेरी परियोजना जो कि structs पर भी डेटाटाइप पर काम करनी चाहिए, और मैं उन कार्यों को बनाना नहीं चाहता – Omkant