C在宏内投射

时间:2013-07-03 23:58:05

标签: c macros casting lvalue

我正在尝试将标准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);

1 个答案:

答案 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));

<小时/> *免责声明:这纯粹是经验性的!我不打算仔细阅读标准来弄清楚细节是什么......