#define FREE1(x) do { free(x); x = NULL; } while (0);
#define FREE2(x) { free(x); x = NULL; }
这些宏有什么区别?
最佳答案
如果您的问题是关于宏中的 do/while
技巧,那没有区别,因为您显然在第一个宏定义中犯了错误,这完全破坏了技巧的目的。您将 ;
放在 whole (0)
之后。正确的实现应该绝对不在第一个宏中的while (0)
之后有;
。这就是 do/while
技巧的全部要点。
现在这段代码无法编译
if (condition)
FREE2(arg);
else
/* something else */;
这段代码也不会编译
do
FREE2(arg);
while (condition);
do/while
技术的要点是让这段代码编译。但由于上述错误,它不会使用您的 FREE1
宏进行编译。
但是,如果你正确定义了第一个宏
#define FREE1(x) do { free(x); x = NULL; } while (0)
// No `;` at the end!!!
然后第一个宏将在上面的代码示例中完美运行。这实际上就是人们在多语句宏中使用 do/while
技术的原因 - 以使其在此类上下文中与普通函数一起正确且统一地工作。
附言附带说明一下,所有此类技术的目的都是将一组多个 语句转换为一个复合语句。在您的特定情况下 free(x); x = NULL;
序列可以重新实现为单个表达式(free(x), x = NULL)
,这消除了对任何多-语句宏技术,即 this
#define FREE3(x) (free(x), x = NULL)
也会起作用。但这是个人喜好问题。
关于c - "do { free(x); x = NULL; } while (0);"和 "{ free(x); x = NULL; }"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993208/