LINUX.ORG.RU

История изменений

Исправление 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:~$

Вот и всё.