C 在宏中强制转换

标签 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 在 this 中的回答中得到的所以问题。

更新:

产生预处理器输出的宏调用如下所示:

XOR_CAST_SWAP(intptr_t, Block1, Block2);

最佳答案

我不相信你可以将类型包装在任意级别的括号中。* 所以编译得很好:

((*(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));


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

关于C 在宏中强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459963/

相关文章:

swift - 为什么我们不能转换为具有关联类型的协议(protocol)类型,而是使用泛型达到相同的效果?

c - 在 C 中,这个基本的堆栈实现会出现段错误。如何修复它?

c++ - 限制浮点精度?

c++ - 如何编写用于从 C 访问 C++ 类成员的包装器(具有继承和构造函数)

用于类型安全回调的 C 宏

c++ - 在资源中连接定义和字符串

c++ - 结构 tbb 与 atomic_ops 的内存对齐

logging - Visual Studio 2005 中的简单宏输出/控制台日志记录?

c++ - 如何将结构转换为 char[] 数组?

c++ - 初始化 QByteArray 避免 [-Wnarrowing]