最后带有额外参数的宏?
Macros with extra parameter at the end?
我不太确定该用什么标题。但是,这是我第三次在 C 宏中看到这种现象。
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
那个额外的零有什么意义吗?例如,据我了解 (1, 0, 0, 0) 只会评估为 1(第一个条目)。
逗号运算符产生其右操作数的值,而不是左操作数。
更新: 正如 @Kninnug in the comments, sigemptyset
is a POSIX function specified to return an int
(specifications: here 指出的那样)。通过使用 (*(what) = 0, 0)
它保证宏产生 int
即使 *(what)
是不同于 int
的另一种类型(sigemptyset
参数应该是类型 sigset_t
).
你的宏定义让我想到两件事:
如果它有 (void *) 0
作为正确的 ,
操作数,它可以模仿一个 return 是空指针的函数:
#define sigemptyset(what) (*(what) = 0, (void *) 0)
int *p = sigemptyset(q);
如果所有其他 sig
函数都应该 return 指针,它会很有用。
我想到的第二件事是允许通过在需要时使用 printf
调用更改 0
来进行调试:
#define sigemptyset(what) (*(what) = 0, printf("sigemptyset\n"))
我不太确定该用什么标题。但是,这是我第三次在 C 宏中看到这种现象。
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
那个额外的零有什么意义吗?例如,据我了解 (1, 0, 0, 0) 只会评估为 1(第一个条目)。
逗号运算符产生其右操作数的值,而不是左操作数。
更新: 正如 @Kninnug in the comments, sigemptyset
is a POSIX function specified to return an int
(specifications: here 指出的那样)。通过使用 (*(what) = 0, 0)
它保证宏产生 int
即使 *(what)
是不同于 int
的另一种类型(sigemptyset
参数应该是类型 sigset_t
).
你的宏定义让我想到两件事:
如果它有 (void *) 0
作为正确的 ,
操作数,它可以模仿一个 return 是空指针的函数:
#define sigemptyset(what) (*(what) = 0, (void *) 0)
int *p = sigemptyset(q);
如果所有其他 sig
函数都应该 return 指针,它会很有用。
我想到的第二件事是允许通过在需要时使用 printf
调用更改 0
来进行调试:
#define sigemptyset(what) (*(what) = 0, printf("sigemptyset\n"))