我正在尝试将标准异或交换算法实现为 C 宏。
我有两个版本的宏。一种不担心类型,另一种尝试将所有内容转换为整数。
下面是宏
#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))
我知道阅读带有演员表的内容很痛苦,但是您的努力值得赞赏。
我得到的错误是:
some_file.c(260,3): expected expression before ')' token
现在,我正在查看它,但我仍然无法弄清楚我的问题出在哪里。
我什至使用了-save-temps
捕获预处理器输出的选项,该行如下所示:
((*(((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));
在任何人提到它之前,我已经意识到我应该把它变成一个函数而不是一个宏。或者更好的是,只需使用那个额外的变量来进行交换,这并不难。
但我想知道为什么这个宏不起作用。括号似乎完全符合我的要求,那为什么抱怨呢?
这LVALUE_CAST
是我从@Jens Gustedt 在这个SO question 中的回答中得到的。
更新:
产生该预处理器输出的宏调用如下所示:
XOR_CAST_SWAP(intptr_t, Block1, Block2);