【问题标题】:constant function parameter as a static array size?常量函数参数作为静态数组大小?
【发布时间】:2013-11-24 19:26:08
【问题描述】:

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

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 谢谢!

【问题讨论】:

    标签: c++ c arrays static constants


    【解决方案1】:

    不要混淆const 合格和常量。

    constqualified 只是表示你没有权限修改变量。

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

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

    【讨论】:

      【解决方案2】:

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

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

      但是,C 确实允许您在那里编写的内容,C++ 不允许,但会在 C++14 中使用“std::dynarray”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多