Если бы это был GCC, вы могли бы сделать это:
#define atob(original, newtype) \
(((union { typeof(original) i; newtype j })(original)).k)
Вау.Уродство.Но использование хорошо:
int i = 0xdeadbeef;
float f = atob(i, float);
Могу поспорить, что ваш компилятор не поддерживает ни оператор typeof
, ни приведение union
, которое делает GCC, поскольку ни стандартное поведение, ни ввероятность того, что ваш компилятор может выполнить union
приведение, это ваш ответ.Изменено, чтобы не использовать typeof
:
#define atob(original, origtype newtype) \
(((union { origtype i; newtype j })(original)).k)
int i = 0xdeadbeef;
float f = atob(i, int, float);
Конечно, это игнорирует проблему того, что происходит, когда вы используете два типа разных размеров, но ближе к «что вы хотите», то есть простой макросфильтр, который возвращает значение, вместо того, чтобы принимать дополнительный параметр.Дополнительные параметры, принимаемые этой версией, приведены только для общности.
Если ваш компилятор не поддерживает приведение union
, что является изящным, но непереносимым приемом, то нет способа сделать это "способом".Вы хотите это ", и другие ответы уже получили это.