gpt4 book ai didi

c - 想知道一些#define 技巧

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:44 25 4
gpt4 key购买 nike

在阅读我的小组项目的代码时,我遇到了很多 DEFINE,其中一些看起来很奇怪。为了概括它,请看下面的两个例子。

示例 1:

#define SNPRINTF(dst, fmt, arg...)  snprintf(dst, sizeof(dst), fmt, ##arg)

“##”在这种情况下是什么意思?我试图删除它们,并编写类似“char buf[1024]; SNPRINTF(buf,”%s,%s”,”abcd”,”efg”);”的代码这产生了相同的结果。所以“##”对我来说似乎没有用也没有坏处。

示例 2:

#define CLOSE(fd)   do  {   \
if (-1 != (fd)) { \
close(fd); \
(fd) = -1; \
} \
} while (0)

do{}while(0) 语句中是否需要塞入内部代码?什么用途?

最佳答案

... 标识一个 variadic macro根据 C99 标准。根据标准,在右侧指示扩展“所有剩余参数”的标记是 __VA_ARGS__ - 我想你正在使用一些具有非标准扩展的 C 编译器,它允许您使用的不同形式(## 是预处理器 token 粘贴运算符,但我不明白它在这里如何应用)。

第二种形式是一个经典的技巧(甚至比 C89 还早)以确保 ; 在宏行为正确之后,在它没有绑定(bind)到错误的 if,等等。基本上,将 do...while 中所需的多个条件语句包装起来,将它们安全地“嵌套”在之后需要分号的 block 中,语法上“就像”宏调用是函数调用。

关于c - 想知道一些#define 技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com