#include <stdio.h>
#define XOR_SWAP(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
#define XOR_PTRSWAP(a,b) {\
union { void *p; size_t n; } __tA_##a = { .p=(void *)(a) },\
__tB_##b = { .p=(void *)(b) };\
XOR_SWAP(__tA_##a.n, __tB_##b.n);\
a = __tA_##a.p; b = __tB_##b.p;\
}
void *codepad_warning_avoid(size_t n) {
union { void *p; size_t n; } x;
x.n = n;
return x.p;
}
int main() {
/*
union { void *p; size_t n; } a = { .n=0x12345678 }, b = { .n=0xABCD9876 };
printf("%p,%p\n", a.p,b.p);
XOR_SWAP(a.n, b.n);
printf("%p,%p\n", a.p,b.p);
*/
void *a, *b;
a = codepad_warning_avoid(0x12345678);
b = codepad_warning_avoid(0xABCD9876);
printf("%p,%p\n", a,b);
XOR_PTRSWAP(a, b);
printf("%p,%p\n", a,b);
return 0;
}