这个C宏中逗号的作用是什么?

这个C宏中逗号的作用是什么?,c,C,我在书中看到了类似的情况: 调用free()后,,0的目的是什么 同样,这里有两个奇怪的逗号: #define stb_sb_add(a,n) (stb__sbmaybegrow(a,n), stb__sbn(a)+=(n), &(a)[stb__sbn(a)-(n)]) 它似乎在运行多个语句,但这不需要分号吗?这一行发生了什么 #define stb_sb_free(a) ((a) ? free(stb__sbraw(a)),0 : 0) 如果a对应于true,则首先执行free(

我在书中看到了类似的情况:

调用
free()
后,
,0
的目的是什么

同样,这里有两个奇怪的逗号:

#define stb_sb_add(a,n) (stb__sbmaybegrow(a,n), stb__sbn(a)+=(n), &(a)[stb__sbn(a)-(n)])

它似乎在运行多个语句,但这不需要分号吗?

这一行发生了什么

#define stb_sb_free(a) ((a) ? free(stb__sbraw(a)),0 : 0)
如果
a
对应于
true
,则首先执行
free(stb_uusbraw(a))
,然后由于
,0
返回
0


通常,将计算所有用逗号分隔的表达式,但结果的类型和值与最右边的表达式相同

逗号运算符?所有表达式都会求值。由于free不返回值,逗号运算符意味着表达式求值为零,而不管条件为true或false。条件运算符必须使两个操作数具有相同的类型(或隐式可转换),不能让一个分支收益率
void
,而另一个分支收益率
int
看起来像是混淆
free()
可以处理空指针。也许stb_uuusbraw不能,但解决方案是重写该函数。逗号运算符返回正确操作数的值,因此在这些(邪恶的)宏中使用它来模拟具有特定预期返回值的函数调用。基本上,这些宏是一些函数调用的“包装器”,编写它们的人希望它们的行为像宏一样。但是第二个宏毫无意义,它充满了没有明显副作用的语句。因此,也许编写代码的人根本不知道他们在做什么。正确的解决方案当然是编写一个实际的包装器函数,它将被内联。
#define stb_sb_free(a) ((a) ? free(stb__sbraw(a)),0 : 0)