swap(x,y) \
  do{\
    struct z{char v[sizeof(x)]}t;\
    t = *(struct z*)&(x);\
    *(struct z*)&(x) = *(struct z*)&(y);\
    *(struct z*)&(y) = t;\
  }while(0);