使用全局结构地址值

时间:2015-04-28 11:09:45

标签: static initialization local

我的目标是初始化一个本地静态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 );  
}

请你解释一下我错过了什么?

1 个答案:

答案 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”在编译时没有在运行时进行评估。