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

'=' should initialize either all enum members or only the first;

本文关键字:枚举成员 初始化 第一个      更新时间:2023-10-16

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

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;            

但是在构建过程中,我收到以下故障警告..

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放在这个枚举中。我该如何解决这个问题?

你的代码已经做了你想要的。您只需要禁止显示此特定警告。

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

如果其他枚举的值无关紧要,你可以这样做

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; 

当然不是C++要求。

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

它上面的语法允许多个枚举器具有初始值设定项。

如果允许,也许您可以关闭是否符合此"MISRA 2004"规则的检查。您也可以简单地忽略它,因为它似乎只是一个Note。就我个人而言,如果它一直出现,我会有点恼火,但也许这只是我。

由于第一个枚举值为 0,并且默认情况下也是该值,因此只需使用默认值即可←我误读了警告,这一点不是解决方案。

和/或关闭 MISRA 规则检查。

和/或,忽略特定注释。显然,您可以通过+esym选项来做到这一点。或者也许-esym,只是尝试一下并检查文档。