LINUX.ORG.RU

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

Исправление Gyros, (текущая версия) :

Исправил как сказал firkax в my_printf

         ...
                case 'q':
                {
                    POINT2 p = va_arg(args, POINT2);
                    printf("(%3.3f, %3.3f)", p.X, p.Y);
                    break;
                }
         ...

Теперь просто

/*
#define UNIVERS_PRINT(x)\
  _Generic( (x),\
    struct POINT2 : printf_pt2,  \
    default       : my_printf    \
)(PFMT(x), (x))
*/

#define UNIVERS_PRINT(x) my_printf(PFMT(x), (x))

и TO_DBL и printf_pt2 не нужны.

Резюмирую.

Есть два способа универсального вывода (одним PRINT(x) для x разных типов) в C:

  1. через проксирующие ф-ции, как говорил LINUX-ORG-RU;

  2. через свой самописный my_printf с новыми символами форматирования для своих структур.

Других способов это делать в C нет.

Исходная версия Gyros, :

Исправил как сказал firkax в my_printf

         ...
                case 'q':
                {
                    POINT2 p = va_arg(args, POINT2);
                    printf("(%3.3f, %3.3f)", p.X, p.Y);
                    break;
                }
         ...

Теперь просто

/*
#define UNIVERS_PRINT(x)\
  _Generic( (x),\
    struct POINT2 : printf_pt2,  \
    default       : my_printf    \
)(PFMT(x), (x))
*/

#define UNIVERS_PRINT(x) my_printf(PFMT(x), (x))

и TO_DBL не нужен.

Резюмирую.

Есть два способа универсального вывода (одним PRINT(x) для x разных типов) в C:

  1. через проксирующие ф-ции, как говорил LINUX-ORG-RU;

  2. через свой самописный my_printf с новыми символами форматирования для своих структур.

Других способов это делать в C нет.