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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…