2013-11-24 73 views
0

我不完全知道为什么,这是行不通的作为静态数组大小的常量函数参数?

void foo(const int a=10){ 
    const int b = 10; 
    int c[a]; 
    int d[b]; 
} 

我认为我的编译器说,一个是不变的 - 我甚至告诉它的默认值是10 :)。

为什么他大喊:

1>sum_floats_txt.cpp(105): error C2057: expected constant expression 
1>sum_floats_txt.cpp(105): error C2466: cannot allocate an array of constant size 0 
1>sum_floats_txt.cpp(105): error C2133: 'c' : unknown size 

我知道它告诉我,但我不知道该怎么做我想做的事: - 功能与尺寸上外界不断可靠的内部静态数组 该函数计算某些内容并返回执行时间(在RTOS中执行)。

所以我想用main的不同参数调用这个函数。找出哪个参数执行最短。

静态数组的工作方式是否存在问题?它在编译时必须具有恒定的大小。所以对于不同的静态数组我必须定义更多的静态数组。

可能的解决方案是创建更多的功能或更多的静态数组与预定义的不同大小。并一个接一个地给他们打电话,但有成千上万个不同的尺寸。

我不想做非自动化迭代以获得最佳参数!在执行之前,可以将main的参数传递给函数吗?

VS2010 + RTX64 2013(应该不是问题) win7 谢谢!

回答

0

不要混合const合格和不变。

const合格只是说你没有权利修改变量。

在C++中,如果const限定变量也是一个编译时间常量,则允许使用您正在使用的构造。在这里它是一个函数的参数,所以编译器无法知道它在编译时会替换的值。

在C中,事情是不同的。在现代的C语言中,即从1999年开始的C语言,允许在执行过程中仅知道这些值的可变长度数组。不幸的是,仍然有C编译器不符合C99。 AFAIR微软编译器就是其中之一。

0

const int a参数是“只读”参数。它不一定是编译器在编译时知道的值。尽管你可以使用模板参数。

template <int N = 42> 
void foo() { 
    int myArray[N]; 
} 

-c但是确实允许你写什么有,C++没有,但会在C++ 14 “std::dynarray”。