为什么这是一个非法的常量表达式?

Why is this an illegal constant expression?

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

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

"Why is the following an illegal constant expression?"

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


请注意,static 的这种用法是为了在对 foo() 的不同调用之间保持变量及其存储值处于活动状态(存在于内存中)- 意味着对象不会被销毁/ 在一次函数执行后释放,因为它是存储的函数局部变量的情况 class automatic.

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

为了您的目的,您可能需要这个:

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

您尝试做的是初始化。上面做的是一个assignment。


也许就您的目的而言,这会更有趣:

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

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

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

例如:

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

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

另一种回答问题的方法是提醒您使用的是 C,而不是 C++。相同的表达式在 C++ 中完全有效,其中静态变量的初始值可能不是常量。