是否可以分配具有强制转换前缀的变量? (在一个宏内)

时间:2015-02-27 02:59:37

标签: c casting macros

有时候在宏中执行赋值很有用,但这可以通过强制转换来阻止,例如:

#define SAFE_FREE(v) do { free(v); v = NULL; } while (0)

/* example use */
SAFE_FREE(foo);
然而,如果' foo'是一个' const int *',需要演员。

free((void *)foo);  /* OK */

但由于演员表而失败了分配

SAFE_FREE((void *)foo);

发出警告:error: lvalue required as left operand of assignment

一种可能的解决方案是投射宏:例如,

#define SAFE_FREE(v) do { free((void *)v); v = NULL; } while (0)

但是我不想在宏中投射,因为这可能会隐藏警告的情况。


有没有办法在碰巧有一个强制转换前缀的宏中分配一个变量?

3 个答案:

答案 0 :(得分:1)

强制转换不是左值,因此它既不会出现在赋值运算符的左侧,也不会出现在一元&运算符的参数中。换句话说,不,没有任何构造可以让你分配一个演员左值。它的左值已被演员删除。

free坚持非const指针的事实有点烦人,但它偶尔也可以帮助你找到bug。但它确实如此。接受这一点,您可以随时定义SAFE_FREESAFE_CONST_FREE

(基于意见的评论使用“#34; SAFE"" SAFE_FREE"删除。意见仍然存在。”

答案 1 :(得分:1)

问题可能在宏部分v = NULL,因为foo是常量。你能把foo改成int *吗?

答案 2 :(得分:0)

释放指向const的指针没有意义,因为它会更改对象(从现有对象到现有对象)。所以我的第一个建议就是安排你的代码,这样就没有必要了。

如果你想允许指向const的指针被释放,但又不想让你的演员去除任何重要的东西,那么你可以这样做:

inline void const_free(void const *ptr) { free((void *)ptr); }

#define SAFE_FREE(ptr) do { const_free(ptr); (ptr) = NULL; } while (0)

NB。 see here有关在C

中正确使用inline的说明