2011-05-17 64 views
3

我得到「初始值設定元素不是常量」以下聲明錯誤。初始值設定元素不是恆>目標C

struct EBD_HEADER 
{ 
    char x;    
    int Key;  
    char Number; 
    int ID;  
    int Version; 
}EBD_HEAD; 

struct EBD_TRAILER 
{ 
    int Crc_0;    
    int Crc_1;   
    int Etx;    
}EBD_TRAIL; 

static const int EBD_HEADER_SIZE = sizeof(EBD_HEAD); 

static const int EBD_TRAILER_SIZE = sizeof(EBD_TRAIL); 

static const int RMH_ENCODED_MSG_OVERHEAD = EBD_HEADER_SIZE + 
EBD_TRAILER_SIZE; //**error:Intializer Element is not a constant** 
+1

靜態const int的RMH_ENCODED_MSG_OVERHEAD =的sizeof(EBD_HEAD)+的sizeof(EBD_TRAIL);這個編譯好。不知道爲什麼。 – taskinoor 2011-05-17 11:14:22

+0

@taskinoor:是的,我照你說的,它works.But我有7〜8個這樣的聲明,所以我換成宏作爲epatel問我要不要 – spandana 2011-05-17 11:35:26

+0

@ron,是epatel者的回答更好。我甚至不是答案。我只是好奇這裏發生了什麼。 – taskinoor 2011-05-17 11:47:23

回答

2

使用宏來代替。

#define EBD_HEADER_SIZE sizeof(EBD_HEAD) 
#define EBD_TRAILER_SIZE sizeof(EBD_TRAIL) 
#define RMH_ENCODED_MSG_OVERHEAD (EBD_HEADER_SIZE + EBD_TRAILER_SIZE) 

覺得可怕嗎?讀this並記住,這是C(其中目標C是基於),而不是C++

+0

非常感謝讓我瞭解有關宏。 – spandana 2011-05-17 11:33:48

2

static const int用C聲明一個int類型,它的值可假定(優化時)不改變的可變。它不像C++那樣聲明一個常量。

如果你想在純C整型常量,您可以使用宏作爲以前的答案提示,或使用enum代替。請注意,您被允許使用匿名enum秒;例如

enum { 
    EBD_HEADER_SIZE = sizeof (EBD_HEAD), 
    EBD_TRAILER_SIZE = sizeof (EBD_TRAIL), 
    RMH_ENCODED_MSG_OVERHEAD = sizeof (EBD_HEAD) + sizeof (EBD_TRAIL) 
}; 

請注意,使用enum這個目的不是沒有問題;你只能聲明整型常量這樣,如果你決定使用一個名爲enum(通過標籤或通過typedef),這是值得注意的是,一些編譯器將根據數量選擇不同尺寸或比對您的類型和其成員常量的值。

顯然,使用#define也有一些缺點,尤其是衆所周知的副作用和操作符優先級的多重評估問題。

+0

感謝alaster解釋清楚我對枚舉和宏。 – spandana 2011-05-18 03:27:30