我的目标是初始化一个本地静态int变量。 我想用一个等于结构成员的偏移值的值来初始化我的变量。
我的结构定义
struct member{
int ID;
char *NAME;
int NO;
};
全球结构声明
struct member FirstMember={.ID = 123, .NAME ="John", .NO=7382737};
struct member SecondMember={.ID = 120, .NAME ="Bill", .NO=454545};
函数和局部静态变量声明
void foo()
{
static int offset = (int)(&FirstMember.NO - &SecondMember.ID );
}
Compiler output: Error[Pe028]: expression must have a constant value..
据我所知,静态局部变量必须用const值初始化。编译器也知道结构及其成员的地址值。因此编译器能够计算成员地址之间的差异。但它返回一条错误消息。
但是这个初始化工作
void foo()
{
static int offset = (int)(&FirstMember.NO - &FirstMember.ID );
}
请你解释一下我错过了什么?
答案 0 :(得分:0)
我认为问题出在你的结构声明中:名称应该是“char *”而不是“char”,因为你试图用“John”初始化它(类型为const char *)。
这对我有用:
struct member{
int ID;
char* NAME;
int NO;
};
struct member FirstMember={123,"John",7382737};
void foo()
{
static int offset = (int)(&FirstMember.NO - &FirstMember.ID );
}
第二个问题是您希望在运行时之前初始化具有未知值的“静态”变量。 所有静态变量都在一个名为“初始化数据”部分的单独位置,编译器需要在编译时确切地知道每个静态变量的值,因为这些值在二进制文件中是“硬编码的”。
即使是这段代码:
int a = 10;
static int x = a;
你会遇到同样的问题,因为“a”在编译时没有在运行时进行评估。