使用全局结构地址值初始化局部静态变量
local static variable initialization by using global struct address values
我的目标是初始化一个本地静态 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 值初始化。编译器还知道结构及其成员的地址值。因此编译器能够计算成员地址之间的差异。但它 returns 一条错误信息。
但是这个初始化有效
void foo()
{
static int offset = (int)(&FirstMember.NO - &FirstMember.ID );
}
你能解释一下我漏掉的地方吗?
我认为问题出在你的结构声明中:名称应该是 "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 );
}
第二个问题是您想在 运行 时间之前用未知值初始化一个 "static" 变量。
所有静态变量都在一个名为 "initialized data" 部分的单独位置,编译器需要在编译时准确知道每个静态变量的值,因为这些值在二进制文件中 "hardcoded"。
即使是这段代码:
int a = 10;
static int x = a;
你会遇到同样的问题,因为 "a" 不是在编译时求值,而是在 运行 时求值。
我的目标是初始化一个本地静态 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 值初始化。编译器还知道结构及其成员的地址值。因此编译器能够计算成员地址之间的差异。但它 returns 一条错误信息。
但是这个初始化有效
void foo()
{
static int offset = (int)(&FirstMember.NO - &FirstMember.ID );
}
你能解释一下我漏掉的地方吗?
我认为问题出在你的结构声明中:名称应该是 "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 );
}
第二个问题是您想在 运行 时间之前用未知值初始化一个 "static" 变量。 所有静态变量都在一个名为 "initialized data" 部分的单独位置,编译器需要在编译时准确知道每个静态变量的值,因为这些值在二进制文件中 "hardcoded"。
即使是这段代码:
int a = 10;
static int x = a;
你会遇到同样的问题,因为 "a" 不是在编译时求值,而是在 运行 时求值。