我正在尝试将标准xor swap算法实现为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在{{3}} SO问题中回答的问题。
更新
产生预处理器输出的宏调用如下所示:
XOR_CAST_SWAP(intptr_t, Block1, Block2);
答案 0 :(得分:2)
我不相信你可以在任意级别的括号中包装类型。 * 所以编译好了:
((*(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));
<小时/> *免责声明:这纯粹是经验性的!我不打算仔细阅读标准来弄清楚细节是什么......