【问题标题】:local static variable initialization by using global struct address values使用全局结构地址值初始化局部静态变量
【发布时间】:2015-07-07 04:57:56
【问题描述】:

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

能否解释一下我遗漏的要点?

【问题讨论】:

    标签: static initialization local


    【解决方案1】:

    我认为问题出在您的结构声明中:名称应为“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”不是在编译时而是在运行时评估的。

    【讨论】:

    • 谢谢。我已经纠正了。但这不是主要问题。
    • @user1871830 这对我有用。你能给我完整的代码吗?可能其他地方有问题……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多