void*
genel programlama için kullanımdan kaldırılmıştır, günümüzde bunları kullanmanız gereken pek çok durum yoktur. Tehlikeli çünkü var olmayan tip güvenliğe yol açarlar. Ve belirttiğiniz gibi, tür bilgilerini de kaybedersiniz, yani enum
ile birlikte hantal bazı sürüklemek zorunda kalacaksınız void*
.
Bunun yerine _Generic
türleri derleme zamanında kontrol edebilen ve tip güvenliği ekleyen C11 kullanmalısınız . Misal:
#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
Desteklemek istediğiniz her türden nitelikli ( ) sürümler sağlamayı unutmayın .
Arayan yanlış türde geçtiğinde daha iyi derleyici hataları istiyorsanız, statik bir iddia ekleyebilirsiniz:
#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)
Eğer böyle bir şey denerseniz int x; func(x);
derleyici mesajını alırsınız "x: incorrect type"
.
void*
noktaların neye işaret ettiğini gösteren ikinci bir parametre eklemeniz gerekecektir .