void*
जेनेरिक प्रोग्रामिंग के लिए एक तरह से पदावनत हैं, ऐसी कई स्थितियाँ नहीं हैं जहाँ आपको इनका उपयोग आजकल करना चाहिए। वे खतरनाक हैं क्योंकि वे गैर-मौजूद प्रकार की सुरक्षा का नेतृत्व करते हैं। और जैसा कि आपने उल्लेख किया है, आप टाइप जानकारी भी खो देते हैं, जिसका अर्थ है कि आपको कुछ बोझिल चीजों को घसीटना enum
होगा void*
।
इसके बजाय आपको C11 का उपयोग करना चाहिए _Generic
जो संकलन-समय पर प्रकारों की जांच कर सकते हैं और प्रकार की सुरक्षा जोड़ सकते हैं। उदाहरण:
#include <stdio.h>
typedef struct
{
int n;
} s_t; // some struct
void func_str (const char* str)
{
printf("Doing string stuff: %s\n", str);
}
void func_s (const s_t* s)
{
printf("Doing struct stuff: %d\n", s->n);
}
#define func(x) _Generic((x), \
char*: func_str, const char*: func_str, \
s_t*: func_s, const s_t*: func_s)(x) \
int main()
{
char str[] = "I'm a string";
s_t s = { .n = 123 };
func(str);
func(&s);
}
const
उन सभी प्रकारों के योग्य ( ) संस्करण प्रदान करना याद रखें जिन्हें आप समर्थन करना चाहते हैं।
यदि आप बेहतर संकलक त्रुटियां चाहते हैं, जब कॉलर गलत प्रकार से गुजरता है, तो आप स्थैतिक अभिक्रिया जोड़ सकते हैं:
#define type_check(x) _Static_assert(_Generic((x), \
char*: 1, const char*: 1, \
s_t*: 1, const s_t*: 1, \
default: 0), #x": incorrect type.")
#define func(x) do{ type_check(x); _Generic((x), \
char*: func_str, const char*: func_str, \
s_t*: func_s, const s_t*: func_s)(x); }while(0)
यदि आप कुछ ऐसा प्रयास करते हैं जैसे int x; func(x);
आपको संकलक संदेश मिलेगा "x: incorrect type"
।
void*
बिंदुओं को।