void*
জেনেরিক প্রোগ্রামিংয়ের জন্য একপ্রকার অবচিত হ'ল, আজকাল আপনার এমন ব্যবহারের খুব বেশি পরিস্থিতি নেই। এগুলি বিপজ্জনক কারণ তারা অস্তিত্বহীন প্রকারের সুরক্ষার দিকে পরিচালিত করে। এবং যেমনটি আপনি উল্লেখ করেছেন, আপনি টাইপ তথ্যটিও হারাবেন, যার অর্থ আপনাকে এর enum
সাথে বরাবর কিছু জটিলকে ঘিরে ফেলতে হবে void*
।
পরিবর্তে আপনার সি 11 ব্যবহার করা উচিত _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*
পয়েন্টগুলি নির্দেশ করে।