Проблема (после устранения различных проблем при использовании целочисленных спецификаторов для форматирования с плавающей запятой) заключается в том, что вы смешиваете типы GCC со средой выполнения MSVC, которая их не понимает.
Во-первых, MinGWкомпилятор GCC, но он использует среду выполнения MSVC для большей части поддержки времени выполнения.Для семейства функций printf()
это означает, что будут работать только те спецификаторы формата, которые поддерживает msvcrt.dll
, и будут работать только те типы, которые msvcrt.dll
.Но GCC ничего не знает об этом, поэтому он будет передавать свои собственные типы и, конечно, спецификаторы формата - это то, что вы передаете в строке формата (хотя GCC может выдавать предупреждения, которые на самом деле не относятся к msvcrt.dll
ситуация).См. Странное поведение "unsigned long long int" для некоторых примеров, основанных на 64-битных целых числах (я думаю, что более новые версии msvcrt.dll
, возможно, исправили некоторые или все проблемы 64-битных int).
Другая часть этой проблемы, с которой вы сталкиваетесь, заключается в том, что long double
в GCC отличается от long double
в MSVC.GCC использует 96-битный или 128-битный тип для long double
для целей x86 или x64 (см. http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html). Однако MSVC использует 64-битный тип - в основном long double
точно такой же, как double
для msvcrt.dll
(http://msdn.microsoft.com/en-us/library/9cx8xs15.aspx):
Предыдущие 16-разрядные версии Microsoft C / C ++ и Microsoft Visual C ++ поддерживали тип данных long double, 80-bit precision. Однако в программировании Win32длинный двойной тип данных отображается на двойной тип данных с 64-битной точностью. Библиотека времени выполнения Microsoft предоставляет длинные двойные версии математических функций только для обратной совместимости. Прототипы длинных двойных функций идентичны прототипам по своим двойным аналогам,за исключением того, что тип данных long double заменяет тип данных double. Длинные двойные версии этих функций не должны использоваться в новом коде.
Так что это сводится к тому, что GCC / MinGW *Тип 1027 * просто не будет совместим с отформатированным вводом / выводом в msvcrt.dll
. Либо переключитесь на использование double
с MinGW, либо, если вам нужноe long double
вам придется привести значения к (double)
для форматированного ввода-вывода или придумать свои собственные процедуры форматирования.
Другой вариант может заключаться в использовании компилятора GCC в Cygwin, который яДумаю, мы не будем полагаться на msvcrt.dll
для форматирования ввода / вывода (за счет использования среды Cygwin).