为啥我不能将常量数组作为参数传递?

Posted

技术标签:

【中文标题】为啥我不能将常量数组作为参数传递?【英文标题】:Why can't I pass constant arrays as arguments?为什么我不能将常量数组作为参数传递? 【发布时间】:2016-08-16 07:17:42 【问题描述】:

在 C 中,为什么我不能这样做:

arrayfn(1.0, 2.0, 3.0);

如果arrayfn 是某个函数,它接受double[]double* 类型的一个参数,无论哪个。尝试这样做会给我一个语法错误。

有没有一种方法可以让我在 C 中实现这样的目标 - 生成并立即传递一个在编译时已知的数组 - 从而避免花费一行代码预先声明和填充它?

【问题讨论】:

您可以使用复合文字。 好答案;试过了;有用;我们到此结束 在您接受答案之前,我们还没有完成。 【参考方案1】:

简答:您需要使用compound literal。类似的东西

 arrayfn( (double[]) 1.0, 2.0, 3.0 );

应该做的工作。


一些解释

说到这部分,为什么arrayfn(1.0, 2.0, 3.0); 不起作用,因为没有复合文字的语法,1.0, 2.0, 3.0 是一个大括号括起来的初始化列表。它不表示可以用作函数参数的“对象”。它们不是 “常量数组”,您可能已经想到了。

要添加更多信息,请引用 C11,第 §6.5.2.5 章,复合文字

一个后缀表达式,由一个带括号的类型名称后跟一个大括号括起来的 初始化器列表是复合文字。它提供了一个未命名的对象,其值由初始化列表给出。

【讨论】:

谢谢!有用。有点奇怪,我的直接冲动是运行(double*)1.0, 2.0, 3.0,它没有做我想要做的事情 - 但足够接近! @user3528438:const 是可选的;复合文字不是常量数组,除非您希望它是一个。可以完全合法地被调用函数中的代码修改。

以上是关于为啥我不能将常量数组作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能将字符串作为模板参数传递?

在 C++ 中将不同大小的常量数组作为函数参数传递

数组名作为函数的参数属于啥传递为啥

Delphi 11:常量对象不能作为 var 参数传递

为啥我们在传递二维数组作为参数时需要指定列大小?

C语言中,数组名作为函数参数,属于啥传递,为啥?