Ну, вы можете просто объявить CATransform3DMakeScale следующим образом:
Matrix CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
C не проверяет тип, чтобы убедиться, что замедление соответствует исходной библиотеке. Если расположение памяти такое же, оно будет работать. Тем не менее, это плохая практика кодирования, и вы должны добавить длинный комментарий, оправдывающий ваши действия ; -)
В противном случае, нет никакого способа обойти это: вы должны использовать указатели или копировать данные. Это будет работать:
CATransform3D m3d = CATransform3DMakeScale ( 1, 2, 3 );
Matrix m;
memcpy(&m, &m3d, sizeof m);
Как вы обнаружили, вы не можете напрямую разыграть структуру. Вы также не можете сделать это:
Matrix m = *(Matrix*) &CATransform3DMakeScale ( 1, 2, 3 );
, поскольку C позволяет использовать оператор & только для значения l.