Из-за того, как работают переменные параметры, C не имеет представления о типе значения, которое вы фактически передаете, кроме %d
и %f
. Когда вы передаете переменный параметр, вы в основном выполняете (void*)&myvalue
, потому что ни компилятор, ни функция во время выполнения не могут определить тип переменной, за исключением того, что указано в строке форматирования. Таким образом, даже несмотря на то, что существует неявное преобразование, компилятор не знает, что это необходимо.
Что ж, double - это 8 байтов в большинстве систем, а float - 4 байта. Таким образом, эти два типа не являются двоично-совместимыми, как есть. И это все равно, что пытаться интерпретировать строку как двойной тип или какой-либо другой несовместимый тип.