2015-04-28 34 views
1

我的目標是初始化一個本地靜態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

我認爲這個問題出現在你的結構聲明中:因爲你試圖用「John」(類型爲const char *)來初始化它,所以名字是「char *」而不是「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」是不是在編譯時而是在運行時進行評估。

+0

謝謝。我已糾正它。但這不是主要問題。 –

+0

@ user1871830這對我有用。你能給我提供完整的代碼嗎?也許其他地方有問題... –

+0

@ user1871830我更新了我的答案 –