c - "do { free(x); x = NULL; } while (0);"和 "{ free(x); x = NULL; }"有什么区别

标签 c

#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/

相关文章:

c 程序将 show 命令输出存储到字符串中

c - 如何在 Visual Studio 中测试我的 .exe 后运行脚本

c - 如何使用 C 遍历文件夹中的所有文件?

c - 如何在编译时确定数组的长度?

c - 如何使用 asn1_create_element 进行嵌套方案?

C - 二叉树 : can't return correct number of pruned nodes

c - 字符串数组 malloc 后出现 "error reading characters of string"错误

c - 如何在静态库中存储版本号?

c++ - 如何在不链接 kernel32.dll 和 ntdll.dll 的情况下运行 PE 镜像

c - 正则表达式似乎有误 - 找不到电子邮件