错误“表达式必须具有恒定值”

时间:2019-08-20 11:28:45

标签: c

当我使用const变量“ a”和“ b”来初始化结构化变量“ cfg”时,我遇到了以下编译器问题“表达式必须具有恒定值”

static const unsigned int a = 1;
static const unsigned int b = 2;


typedef struct
{
    const uint32 InitTypestruct_elem1;   
    const uint32 InitTypestruct_elem2;   
}InitType;

typedef struct
{
    InitType BoardTypestruct_elem1;
}BoardType;


static const BoardType cfg =
{
    /* pbgc cfg */
    .BoardTypestruct_elem1 =
    {
        ***.InitTypestruct_elem1 = a,
        ***.InitTypestruct_elem2 = b
    }
};


const InitType *cfg(void)
{
    return &cfg.BoardTypestruct_elem1;
}


int main()
{
    //cfg

    return 0;
}

编译器警告引起的原因与***

为什么会发生此问题? a和b是常量值吗?

3 个答案:

答案 0 :(得分:1)

除了常量表达式(在这种情况下为整数常量表达式)之外,不能使用静态存储持续时间初始化变量。

不幸的是,C在整数常量表达式和“ const限定”变量之间产生了区别。 (此处的C和C ++不同。)这意味着cfg变量的初始化程序必须是整数常量(例如1),枚举或#define值,或这样的操作数组成的表达式。

也就是说,如果您在初始化程序内进行任何算术运算,则所有操作数都必须是整数常量。
因此,如果1 + 1是变量,则a + 1可以,但a不能。

答案 1 :(得分:1)

简化其他答案:

*(new_array + 0)

static const unsigned int a = 1; 是变量,无论它是const。您不能在编译时用另一个(全局)变量初始化全局变量。编译器认为它不是常量。

答案 2 :(得分:0)

根据C标准(6.7.9初始化)

  

4初始化对象中具有静态对象的所有表达式   或线程存储持续时间应为常量表达式或字符串   文字。

和(6.6常量表达式)

  

2常量表达式可以在翻译过程中求值   而不是运行时,因此可以在任何常量位置使用   可能是。

  

7允许初始化程序中的常量表达式具有更大的自由度。   此类常数表达式应为或评估为   以下:

     

-算术常数表达式,

     

-空指针常量,

     

-地址常数,或

     

-完整对象类型加上或减去一个的地址常数   整数常量表达式

  

8算术常数表达式应具有算术类型和   只能有整数常量的操作数,浮点数   常量,枚举常量,字符常量和sizeof   表达式。算术常数表达式中的强制转换运算符应   仅将算术类型转换为算术类型,除非作为   sizeof运算符的操作数,其结果是整数常量。

您可以使用枚举符代替这些声明

static const unsigned int a = 1;
static const unsigned int b = 2;

例如

enum { A = 1, B = 2 };

static const BoardType cfg = {
    /* pbgc cfg */
    .BoardTypestruct_elem1 =
    {
        .InitTypestruct_elem1 = A,
        .InitTypestruct_elem2 = B
    } };