Question

I am trying to implement the standard xor swap algorithm as a C macro.

I have two versions of the macro. One that doesn't worry about the types and one that attempts to cast everything to an integer.

Here are the macro's

#define XOR_SWAP(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))

#define LVALUE_CAST(type,value) (*((type)*)&(value))
#define XOR_CAST_SWAP(type,a,b) (LVALUE_CAST((type),(a))=(type)(a)^(type)(b),LVALUE_CAST((type),(b))=(type)(b)^(type)(a),LVALUE_CAST((type),(a))=(type)(a)^(type)(b))

I know it's a pain to read the one with a cast, but your efforts are appreciated.

The error that I'm getting is:

some_file.c(260,3): expected expression before ')' token

Now, I'm looking at it but I still can't figure out where my problem lies.

I've even used the -save-temps option to capture the preprocessor output and the line looks like this:

((*(((intptr_t))*)&((Block1)))=(intptr_t)(Block1)^(intptr_t)(Block2),(*(((intptr_t))*)&((Block2)))=(intptr_t)(Block2)^(intptr_t)(Block1),(*(((intptr_t))*)&((Block1)))=(intptr_t)(Block1)^(intptr_t)(Block2)); 

Before anybody mentions it, I've since realized that I should probably make this a function instead of a macro. Or even better, just use that extra variable to do the swap, it isn't hard.

But I want to know why this macro doesn't work. The brackets seem to match exactly as I wanted them to, so why is it complaining?

The LVALUE_CAST is something I took from @Jens Gustedt's answer in this SO question.

Update:

The macro call that produces that preprocessor output looks like this:

XOR_CAST_SWAP(intptr_t, Block1, Block2);
Was it helpful?

Solution

I don't believe you can wrap types in arbitrary levels of parentheses.* So this compiles fine:

((*(intptr_t*)&((Block1)))=(intptr_t)(Block1)^(intptr_t)(Block2),(*(intptr_t*)&((Block2)))=(intptr_t)(Block2)^(intptr_t)(Block1),(*(intptr_t*)&((Block1)))=(intptr_t)(Block1)^(intptr_t)(Block2));


* Disclaimer: this is purely empirical! I don't intend to peruse the standard to figure out what the details are...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top