想知道一些#define技巧

kin*_*kai 1 c c-preprocessor

在阅读我的小组项目的代码时,我遇到了许多DEFINE,其中一些似乎很奇怪.要概括它,请查看以下2个示例.

例1:

#define SNPRINTF(dst, fmt, arg...)  snprintf(dst, sizeof(dst), fmt, ##arg)
Run Code Online (Sandbox Code Playgroud)

"##"在这种情况下意味着什么?我试图删除他们两个,并写这样的代码 "字符BUF [1024]的snprintf(buf中," %S%S " "ABCD", "EFG");" 这产生了相同的结果.所以"##"似乎毫无用处,对我没有任何伤害.

例2:

#define CLOSE(fd)   do  {   \
        if (-1 != (fd)) {   \
                    close(fd);  \
                    (fd)    = -1;   \
                }   \
} while (0)
Run Code Online (Sandbox Code Playgroud)

有必要将内部代码填充到do{}while(0)语句中吗?什么用途?

Ale*_*lli 8

根据C99标准...识别可变宏.令牌以指示右边"所有剩余的参数"的扩张,按照标准,就是__VA_ARGS__-我想你使用的是C编译器使用非标准的扩展,它允许您使用的是不同的形式(##被预处理器令牌粘贴操作符,但我不知道这是如何适用的).

第二种形式是经典技巧(比C89更老)以确保;宏在行为正确之后,else在它没有绑定到错误之后if,依此类推.基本上,包装所需的多个和条件语句do......将while它们安全地"嵌套"在一个后面需要分号的块中,在语法上"就好像"宏调用是一个函数调用.