'='应初始化所有枚举成员或仅初始化;

时间:2014-01-16 16:54:29

标签: c++ enums lint

我正在尝试使用以下枚举值构建我的代码:

typedef enum {           
    YUV_420P=0,    
    YUV_422P,         
    RGB_P,       
    BAYER_P,      
    YUV_422IBE,     
    YUV_444IBE,       
    A_1BIT,                  
    YUV_420SP,          
    COMPLEX_8BIT,             
    COMPLEX_16BIT,            
    COMPLEX_32BIT,        
    COMPLEX_U8BIT,           
    COMPLEX_U16BIT,            
    COMPLEX_U32BIT,                                   
    ALPHA_TYPE=0x8000                  
} Format;            

但在建筑期间,我收到了以下的linting警告..

sample.h: Note 960: Violates MISRA 2004 Required Rule 9.3, '=' should initialize either all enum members or only the first; enumerator: 'ALPHA_TYPE' ..  

我不想更改ALPHA_TYPE的值,我想只将ALPHA_TYPE放在此枚举中。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

您的代码已经做了您想要的。你只需要压制这个特殊的警告。

另一方面,如果您确实需要遵守此MISRA 2004规则9.3,那么您将需要更改代码并找到不同的解决方案。但是你不可能两种方式都有。

答案 1 :(得分:2)

如果其他枚举的值无关紧要,您可以执行此操作

typedef enum {           
    ALPHA_TYPE=0x8000,                  
    YUV_420P,    
    YUV_422P,         
    RGB_P,       
    BAYER_P,      
    YUV_422IBE,     
    YUV_444IBE,       
    1BIT,                  
    YUV_420SP,          
    COMPLEX_8BIT,             
    COMPLEX_16BIT,            
    COMPLEX_32BIT,        
    COMPLEX_U8BIT,           
    COMPLEX_U16BIT,            
    COMPLEX_U32BIT                                   
} Format; 

定义所有这样的枚举值(这样可以避免更改枚举值之一,如果添加新值)

  typedef enum {                           
    YUV_420P=0,    
    YUV_422P=1,         
    RGB_P=2,       
    BAYER_P=3,      
    YUV_422IBE=4,     
    YUV_444IBE=5,       
    1BIT=6,                  
    YUV_420SP=7,          
    COMPLEX_8BIT=8,             
    COMPLEX_16BIT=9,            
    COMPLEX_32BIT=10,        
    COMPLEX_U8BIT=11,           
    COMPLEX_U16BIT=12,            
    COMPLEX_U32BIT=13,
    ALPHA_TYPE=0x8000                                   
} Format; 

答案 2 :(得分:1)

这肯定不是C ++的要求。

  

[C++11: 7.2/2]:带有=枚举器定义为关联的枚举器提供常量表达式指示的值。如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始值设定项的枚举器定义为枚举数提供了通过增加前一个枚举器的值而获得的值   一个人。

上面的语法允许多个枚举器拥有初始值。

如果您被允许,也许您可​​以关闭检查是否符合此“MISRA 2004”规则。您也可以忽略它,因为它似乎只是Note。就我个人而言,我总是有点恼火,但也许这只是我。

答案 3 :(得分:0)

由于第一个枚举值为0,因为它也是默认值,只需使用默认值。 ←我误读了警告,这一点不是解决方法

和/或,关闭MISRA规则检查。

和/或忽略具体说明。显然你可以通过+esym选项来做到这一点。或者也许-esym,只需尝试一下并查看文档。