常量函数参数作为静态数组大小?

时间:2013-11-24 19:26:08

标签: c++ c arrays static const

我不完全确定为什么这不起作用

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

我以为我对编译器说a是常量 - 我甚至告诉它默认值是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 谢谢!

2 个答案:

答案 0 :(得分:0)

不要混淆const限定和常数。

const有资格说你没有权利修改变量。

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

在C中,情况有所不同。在现代C中,即自1999年以来的C,允许具有仅在执行期间已知的值的可变长度数组。不幸的是,仍有C编译器不符合C99。 AFAIR micorsoft编译器就是其中之一。

答案 1 :(得分:0)

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

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

C确实允许你在那里写的东西,C ++没有,但在C ++ 14中会有“std::dynarray”。

相关问题