This works well only with integers.
For floats it will fail (e.g. try running it with a very large float and a very small one).
I would suggest something as follows:
#define swap(x,y) do \
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
memcpy(swap_temp,&y,sizeof(x)); \
memcpy(&y,&x, sizeof(x)); \
memcpy(&x,swap_temp,sizeof(x)); \
} while(0)
memcpy is pretty optimized when the amount to copy is known at compilation time.
Also, there’s no need to manually pass a type name or use compiler specific extensions.