当我使用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是常量值吗?
答案 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
} };