История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Просто потому что скорее всего там дохренище сильно различается логика
И чё =), Си это тот язык где типами ты рулишь все они в твоей власти.
Создавай тип любой, вешай на него любую логику, генериком объединяй обработку разных типов с одним ожидаемым результатом.
Например тебе в программе нужно получать пиксель из картинки, одна картинка в GPU и её надо извлечь сначала, вторая уже в памяти лежит и просто надо взять пиксель, третья вообще в файле и нужно сначала загрузить и всё прочее сделать следующая например вообще по сети из интернетов, но излишне это прописывать и так понятно.
#include <stdio.h>
typedef struct
{
int id; //GL_UINT
}texture;
typedef struct
{
char * data;
size_t size;
int depth;
int mode;
}image;
typedef struct
{
char * path;
}file;
void get_pixel_texture(texture tex)
{
printf("get pixel from texture\n");
}
void get_pixel_image(image img)
{
printf("get pixel from image\n");
}
void get_pixel_file(file fle)
{
printf("get pixel from file\n");
}
#define get_pixel(object) \
_Generic( (object),\
texture: get_pixel_texture,\
image: get_pixel_image,\
file: get_pixel_file)(object);
int main(int argc, char *argv[])
{
file f;
image i;
texture t;
get_pixel(f);
get_pixel(i);
get_pixel(t);
return 0;
}
dron@gnu:~$ gcc gen.c && ./a.out
get pixel from file
get pixel from image
get pixel from texture
dron@gnu:~$
Вот и всё. Плюс если ты в get_pixel
сунешь по ошибке не тот тип, то программа просто не соберётся
gen.c:38:20: error: ‘_Generic’ selector of type ‘struct bad_struct’ is not compatible with any association
38 | _Generic( (object),\
| ^
gen.c:55:5: note: in expansion of macro ‘get_pixel’
55 | get_pixel(b);
| ^~~~~~~~~
Так что зря ты. Возможно ты подумал что генерик разрешает только фундаментальные типы char, int и подобные
Исправление LINUX-ORG-RU, :
Просто потому что скорее всего там дохренище сильно различается логика
И чё =), Си это тот язык где типами ты рулишь все они в твоей власти.
Создавай тип любой, вешай на него любую логику, генериком объединяй обработку разных типов с одним ожидаемым результатом.
Например тебе в программе нужно получать пиксель из картинки, одна картинка в GPU и её надо извлечь сначала, вторая уже в памяти лежит и просто надо взять пиксель, третья вообще в файле и нужно сначала загрузить и всё прочее сделать следующая например вообще по сети из интернетов, но излишне это прописывать и так понятно.
#include <stdio.h>
typedef struct
{
int id; //GL_UINT
}texture;
typedef struct
{
char * data;
size_t size;
int depth;
int mode;
}image;
typedef struct
{
char * path;
}file;
void get_pixel_texture(texture tex)
{
printf("get pixel from texture\n");
}
void get_pixel_image(image img)
{
printf("get pixel from image\n");
}
void get_pixel_file(file fle)
{
printf("get pixel from file\n");
}
#define get_pixel(object) \
_Generic( (object),\
texture: get_pixel_texture,\
image: get_pixel_image,\
file: get_pixel_file)(object);
int main(int argc, char *argv[])
{
file f;
image i;
texture t;
get_pixel(f);
get_pixel(i);
get_pixel(t);
return 0;
}
dron@gnu:~$ gcc gen.c && ./a.out
get pixel from file
get pixel from image
get pixel from texture
dron@gnu:~$
Вот и всё. Плюс если ты в get_pixel
сунешь по ошибке не тот тип, то программа просто не соберётся
gen.c:38:20: error: ‘_Generic’ selector of type ‘struct bad_struct’ is not compatible with any association
38 | _Generic( (object),\
| ^
gen.c:55:5: note: in expansion of macro ‘get_pixel’
55 | get_pixel(b);
| ^~~~~~~~~
Так что зря ты.
Исправление LINUX-ORG-RU, :
Просто потому что скорее всего там дохренище сильно различается логика
И чё =), Си это тот язык где типами ты рулишь все они в твоей власти.
Создавай тип любой, вешай на него любую логику, генериком объединяй обработку разных типов с одним ожидаемым результатом.
Например тебе в программе нужно получать пиксель из картинки, одна картинка в GPU и её надо извлечь сначала, вторая уже в памяти лежит и просто надо взять пиксель, третья вообще в файле и нужно сначала загрузить и всё прочее сделать следующая например вообще по сети из интернетов, но излишне это прописывать и так понятно.
#include <stdio.h>
typedef struct
{
int id; //GL_UINT
}texture;
typedef struct
{
char * data;
size_t size;
int depth;
int mode;
}image;
typedef struct
{
char * path;
}file;
void get_pixel_texture(texture tex)
{
printf("get pixel from texture\n");
}
void get_pixel_image(image img)
{
printf("get pixel from image\n");
}
void get_pixel_file(file fle)
{
printf("get pixel from file\n");
}
#define get_pixel(object) \
_Generic( (object),\
texture: get_pixel_texture,\
image: get_pixel_image,\
file: get_pixel_file)(object);
int main(int argc, char *argv[])
{
file f;
image i;
texture t;
get_pixel(f);
get_pixel(i);
get_pixel(t);
return 0;
}
dron@gnu:~$ gcc gen.c && ./a.out
get pixel from file
get pixel from image
get pixel from texture
dron@gnu:~$
Вот и всё. Плюс если ты в get_pixel
сунешь по ошибке не тот тип, то программа просто не соберётся
gen.c:38:20: error: ‘_Generic’ selector of type ‘struct bad_struct’ is not compatible with any association
38 | _Generic( (object),\
| ^
gen.c:55:5: note: in expansion of macro ‘get_pixel’
55 | get_pixel(b);
| ^~~~~~~~~
Исправление LINUX-ORG-RU, :
Просто потому что скорее всего там дохренище сильно различается логика
И чё =), Си это тот язык где типами ты рулишь все они в твоей власти.
Создавай тип любой, вешай на него любую логику, генериком объединяй обработку разных типов с одним ожидаемым результатом.
Например тебе в программе нужно получать пиксель из картинки, одна картинка в GPU и её надо извлечь сначала, вторая уже в памяти лежит и просто надо взять пиксель, третья вообще в файле и нужно сначала загрузить и всё прочее сделать следующая например вообще по сети из интернетов, но излишне это прописывать и так понятно.
#include <stdio.h>
typedef struct
{
int id; //GL_UINT
}texture;
typedef struct
{
char * data;
size_t size;
int depth;
int mode;
}image;
typedef struct
{
char * path;
}file;
void get_pixel_texture(texture tex)
{
printf("get pixel from texture\n");
}
void get_pixel_image(image img)
{
printf("get pixel from image\n");
}
void get_pixel_file(file fle)
{
printf("get pixel from file\n");
}
#define get_pixel(object) \
_Generic( (object),\
texture: get_pixel_texture,\
image: get_pixel_image,\
file: get_pixel_file)(object);
int main(int argc, char *argv[])
{
file f;
image i;
texture t;
get_pixel(f);
get_pixel(i);
get_pixel(t);
return 0;
}
dron@gnu:~$ gcc gen.c && ./a.out
get pixel from file
get pixel from image
get pixel from texture
dron@gnu:~$
Вот и всё.
Исходная версия LINUX-ORG-RU, :
Просто потому что скорее всего там дохренище сильно различается логика
И чё, Си это тот язык где типами ты рулишь все они в твоей власти.
Создавай тип любой, вешай на него любую логику, генериком объединяй обработку разных типов с одним ожидаемым результатом.
Например тебе в программе нужно получать пиксель из картинки, одна картинка в GPU и её надо извлечь сначала, вторая уже в памяти лежит и просто надо взять пиксель, третья вообще в файле и нужно сначала загрузить и всё прочее сделать следующая например вообще по сети из интернетов, но излишне это прописывать и так понятно.
#include <stdio.h>
typedef struct
{
int id; //GL_UINT
}texture;
typedef struct
{
char * data;
size_t size;
int depth;
int mode;
}image;
typedef struct
{
char * path;
}file;
void get_pixel_texture(texture tex)
{
printf("get pixel from texture\n");
}
void get_pixel_image(image img)
{
printf("get pixel from image\n");
}
void get_pixel_file(file fle)
{
printf("get pixel from file\n");
}
#define get_pixel(object) \
_Generic( (object),\
texture: get_pixel_texture,\
image: get_pixel_image,\
file: get_pixel_file)(object);
int main(int argc, char *argv[])
{
file f;
image i;
texture t;
get_pixel(f);
get_pixel(i);
get_pixel(t);
return 0;
}
dron@gnu:~$ gcc gen.c && ./a.out
get pixel from file
get pixel from image
get pixel from texture
dron@gnu:~$
Вот и всё.