LINUX.ORG.RU

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

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

то корректно выводится значение точки только в случае real_type=double.

Я удивлён что он с double корректно работает. Тебе просто повезло, не надо на такое рассчитывать. Сделай ещё один generic-макрос, который будет превращать POINT2 в два его поля, идущие через запятую (а остальные типы пробрасывать как есть). Только учти, что если POINT2, данный ему на вход, вычисляемый, будет считаться два раза. Чтобы это исправить, сделай generic-макрос для самой печати, где для POINT2 полностью отдельная ветка: сложить структуру во временную переменную, а потом печатать поля из неё.

Как сделать чтобы все таки различался вывод float и double, и для float стало выводить корректно?

printf не умеет печатать float-ы вообще. Когда ты ему суёшь float в аргумент, компилятор автоматически конвертирует его (это касается всех функций с переменным числом аргументов). А вот структуру он не конвертирует и получается ерунда.

Та же самая история с типами char/short/int. Первые два на самом деле не поддерживаются, компилятор их конвертирует в int перед тем как отправить в printf.

Исправление firkax, :

то корректно выводится значение точки только в случае real_type=double.

Я удивлён что он с double корректно работает. Тебе просто повезло, не надо на такое рассчитывать. Сделай ещё один generic-макрос, который будет превращать POINT2 в два его поля, идущие через запятую (а остальные типы пробрасывать как есть). Только учти, что если POINT2, данный ему на вход, вычисляемый, будет считаться два раза. Чтобы это исправить, сделай generic-макрос для самой печати, где для POINT2 полностью отдельная ветка: сложить структуру во временную переменную, а потом печатать поля из неё.

Как сделать чтобы все таки различался вывод float и double, и для float стало выводить корректно?

printf не умеет печатать float-ы вообще. Когда ты ему суёшь float в аргумент, компилятор автоматически конвертирует его (это касается всех функций с переменным числом аргументов). А вот структуру он не конвертирует и получается ерунда.

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

то корректно выводится значение точки только в случае real_type=double.

Я удивлён что он с double корректно работает. Тебе просто повезло, не надо на такое рассчитывать. Сделай ещё один generic-макрос, который будет превращать POINT2 в два его поля, идущие через запятую (а остальные типы пробрасывать как есть). Только учти, что если POINT2, данный ему на вход, вычисляемый, будет считаться два раза. Чтобы это исправить, сделай generic-макрос для самой печати, где для POINT2 полностью отдельная ветка: сложить структуру во временную переменную, а потом печатать поля из неё.