Всех приветствую и поздравляю с праздником!
Есть два вопроса.
Есть такой макрос
#define PFMT(x) \
_Generic( (x), \
int : "%d", \
long : "%ld", \
double : "%f", \
float : "%f", \
struct POINT2 : "(%6.3f, %6.3f)"\
)
// универсальный printf
#define PRINT(x) printf( PFMT( (x) ), (x) )
Этот PRINT работает отлично.
А как сделать, чтобы выводилось с доп. строковой информацией, вроде такого:
printf("Значение "##PFMT(k)##" вне заданного диапазона\n", k);
Это не компилируется (с символами конкатенации ##).
Нужно чтобы выводилось, например, для
<type> k=2025;
строка
Значение 2025 вне заданного диапазона\n
без зависимости от типа type (согласно вышеописанному макросу с Generic )
- Как средствами макропроцессора вывести с дополнит. словами, а не только само значение?
Второй вопрос.
Если есть структура
typedef struct POINT2
{
<real_type> X,Y;
} POINT2;
где real_type м.б. или float, или double.
И например задано
POINT2 pt = (POINT2){7.0f, 13.0f};
PRINT(pt);
то корректно выводится значение точки только в случае real_type=double.
Если real_type=float, то
(4194305.014, -5487458222577050490711218714016849409047503760087531831195489080004217105968837296341131586189673352421011955033155197938514935435243923001276435782347988725676512038006187992514731981983482317923338165440313421583742788594446834364183181944583960924683897740668190287231179824590846527476002567405699072.000)
и компилируется с warning-ами
format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘POINT2’ {aka ‘struct POINT2’} [-Wformat=]
246 | struct POINT2 : "(%6.3f, %6.3f)", \```
Это из-за того что для форматирования float и double исп. один и тот же символ форматирования %f.
- Как сделать чтобы все таки различался вывод float и double, и для float стало выводить корректно?
Заранее благодарен за содержательный ответы по существу. Спасибо!