4

我试图保留一个变量,以便在调试优化代码时可以看到它的值。为什么以下是非法的常量表达式?

   void foo(uint_32 x)
   {
       static uint_32 y = x;
       ...
   }
4

4 回答 4

5

为什么下面的常量表达式是非法的?

因为static变量必须用编译时已知的值初始化,而x仅在运行时确定。


请注意,这种使用static是为了在不同的foo()alive调用(存在于内存中)之间保持变量及其存储的值 - 意味着在一次执行函数后对象不会被销毁/释放,因为它就是这种情况带有存储类automatic 的函数局部变量。

static在每个函数调用 new 时创建和初始化变量是没有意义的。

于 2020-05-14T14:49:05.053 回答
5

出于您的目的,您可能想要这个:

void foo(uint_32 x)
{
    static uint_32 y;
    y = x;
    ...
}

您尝试做的是初始化。上面所做的是一个作业。


也许出于您的目的,这会更有趣:

static uint_32 y;
void foo(uint_32 x)
{
    y = x;
    ...
}

现在,一旦函数完成y,调试器就可以轻松访问该变量。foo

于 2020-05-14T14:49:23.470 回答
0

使用静态存储说明符声明的变量必须使用常量值初始化。

例如:

#define x 5
void foo()
{
    static int y = x;
}

或者

void foo()
{
    static int y = 5;
}
于 2020-05-14T14:50:53.373 回答
0

Another way to answer your question is to remind that you are using C, not C++. The same expression is fully valid in C++ where the initial value for a static variable may not be a constant.

于 2020-06-12T05:53:35.307 回答