有时候在宏中执行赋值很有用,但这可以通过强制转换来阻止,例如:
#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)
但是我不想在宏中投射,因为这可能会隐藏应警告的情况。
有没有办法在碰巧有一个强制转换前缀的宏中分配一个变量?
答案 0 :(得分:1)
强制转换不是左值,因此它既不会出现在赋值运算符的左侧,也不会出现在一元&
运算符的参数中。换句话说,不,没有任何构造可以让你分配一个演员左值。它的左值已被演员删除。
free
坚持非const指针的事实有点烦人,但它偶尔也可以帮助你找到bug。但它确实如此。接受这一点,您可以随时定义SAFE_FREE
和SAFE_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
的说明