我想立即将参数传递给函数,而不创建像这样的附加变量:
void DrawSprite( float a[2], float b[2] ) { /* */ }
DrawSprite( (0.0f, 0.0f), (50.0f, 50.0f) );
是否可能,如果可以,该怎么做?
答案 0 :(得分:4)
您可以执行以下操作(使用g++ -std=c++11
编译):
#include <array>
typedef std::array<float, 2> Point2f;
void foo(Point2f v) {
// do something
}
int main() {
foo( {1.0, 1.0} );
}
{}
- 样式初始化称为初始化列表,它可从C ++ 11开始提供。 std::array
也是如此。
供参考:
答案 1 :(得分:3)
是的,你可以这样做。
试试这个:
void DrawSprite( float a[2], float b[2] ) { /* */ }
DrawSprite( (float[2]){1.0, 2.0}, (float[2]){3.0, 4.0} );
在第二行包含数组大小是好的,因为它允许编译器强制执行数组的大小,但你不必这样做。
如果您输入的语法很烦人,可以使用预处理器宏:
#define P(X,Y) (float[]){X, Y}
DrawSprite(P(1.0,2.0), P(3.0,4.0));
或者也许是内联函数。
答案 2 :(得分:3)
您可以这样称呼它:
float x[2] = {0.0F, 0.0F};
float y[2] = {50.0F, 50.0F};
DrawSprite(x, y);
答案 3 :(得分:2)
DrawSprite( (float[2]){1.0, 2.0}, (float[2]){3.0, 4.0} );
这适用于GCC,但在MSVC中不起作用。我相信这不是标准的C ++
答案 4 :(得分:1)
最好将它声明为使用malloc声明的float数组。它将使您能够在工作完成后随意释放阵列。因为malloc内存将在堆中分配。传递数组有时会导致阶段模糊,导致代码崩溃
答案 5 :(得分:1)
这个重要问题的一些答案似乎具有误导性。问题是:将固定大小的数组传递给函数。首先是
float x[2] = {0.1F, 0.2F};
float y[2];
y=x;
是error: invalid array assignment
(在gcc 4.6.1上;但我们应该在这里说“标准”,而不是特定的编译器功能)。非常正确 - 操作应该完成什么? x
和y
都指向堆栈上的一段内存,因此将float*
x
复制到y
几乎没有意义,因为值不会被复制到最初保留的地方y[0],y[1]
。
float x[2]
唯一明智的演员是float *y
。这正是调用函数时发生的情况。您的函数DrawSprite(float a[2], float b[2])
实际上被视为DrawSprite(float* a, float* b)
(您可以打印typeid(a).name()
进行检查)。因此,您可以将x
传递给DrawSprite
,此x
只会转换为float*
。
第二个问题是初始化。代码(float[2]){1.0, 2.0}
确实构造了float
的固定大小临时数组(再次可以typeid((float[2]){1.0, 2.0}).name()
进行检查,至少在gcc
上),但是你可以做的不多使用此数组,因为禁止分配float [2]
。您可以将其投放到float*
(例如,按z=(float[2]){1.0,2.0};
分配,但分配到float* z;
,所以它真的是z=(float*)(float[2]){1.0,2.0};
),或者您可以将其传递给您的函数,相同,即转换为float*
。