【发布时间】:2020-07-10 11:22:16
【问题描述】:
&(float){0}
我在一些 C 代码中遇到过这种情况。它被指定为函数中的 float* 参数。什么意思?
【问题讨论】:
标签: c
&(float){0}
我在一些 C 代码中遇到过这种情况。它被指定为函数中的 float* 参数。什么意思?
【问题讨论】:
标签: c
foo(&(float){0})
是
的简写float x = 0;
foo(&x);
它们之间的唯一区别是,使用复合文字时,无法在调用后访问该号码(如果 foo 更改它,这很重要)。
【讨论】:
&(float){0} 参数很可能是foo() 中缺少NULL 参数检查的解决方法:其效果是简单地丢弃foo() 决定写入的任何内容内存位置。
foo() 将指针存储在某处作为副作用。当然,这将是疯狂的,因为复合字面量存在于堆栈中并且会 Poof!在其范围的末尾。但是,如果我学到了一件事,那就是:绝对没有什么疯狂到足以阻止它在某些生产代码中完成。
foo() 内的NULL 检查和显式传递foo(NULL) 的调用来实现。在这种情况下不使用复合文字。 foo(&(float){0}) 仅在以下情况下才需要:a)参数是可选的,b)foo() 没有这样的 NULL 检查,以及 c)无论出于何种原因,您都无法添加该检查。
用于将常量表达式传递给期望引用的函数。
例子
float sq(float *f)
{
*f = *f * *f;
return *f;
}
int main(void)
{
printf("%f\n", sq(&(float){3.0f}));
}
【讨论】: