使用全局结构地址值初始化局部静态变量

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" 不是在编译时求值,而是在 运行 时求值。