【问题标题】:C Casts Inside a MacroC 在宏中强制转换
【发布时间】:2013-07-03 23:58:05
【问题描述】:

我正在尝试将标准 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 SO 问题中的回答中得到的。

更新:

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

XOR_CAST_SWAP(intptr_t, Block1, Block2);

【问题讨论】:

  • 这只是为了好玩吗?使用 xor 交换(尤其是隐藏在宏后面,并且使用所有这些强制转换)是一个非常糟糕的主意......(更新:刚刚注意到你写了一个免责声明......)
  • 是的,只是为了满足我的好奇心。
  • 产生该输出的宏调用是什么样的?
  • 看起来像XOR_CAST_SWAP(intptr_t, Block1, Block2);

标签: c macros casting lvalue


【解决方案1】:

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

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


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

【讨论】:

  • 你是对的,删除它们确实解决了我的问题。谢谢。我接受了答案,但请问您是否知道括号对类型有这种影响的实际原因?
  • @nonsensical:我想这只是 C 语言的语法决定的。
  • @nonsensical 是的,括号根本不会出现在 type-specifier 的语法中,这就是 int 的含义,并且是 cast- 所必需的表达式。唯一允许无限嵌套的地方似乎是抽象声明符,例如(int(((((*)))))(void)) foo 转换为指向函数类型的指针。
  • @Potatoswatter 你是对的。我自己只是在cs.dartmouth.edu/~mckeeman/cs48/references/c.html 查找语法并发现相同,但我认为常规声明符也允许无限括号。
  • @nonsensical 是的,但是常规声明符不能进入强制转换表达式。
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多