2011-05-17 33 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