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

C++ '=';应初始化所有枚举成员或仅初始化第一个枚举成员;,c++,enums,lint,C++,Enums,Lint,我正在尝试使用以下枚举值构建代码: typedef enum { YUV_420P=0, YUV_422P, RGB_P, BAYER_P, YUV_422IBE, YUV_444IBE, A_1BIT, YUV_420SP, COMPLEX_8BIT,

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

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;            
但是在建造过程中,我得到了下面的警告

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_类型的值,我只想将ALPHA_类型放在这个枚举中。如何解决此问题?

您的代码已经满足您的要求。您只需要取消显示此特定警告

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;            

另一方面,如果您确实需要遵守MISRA 2004规则9.3,那么您需要更改代码并找到不同的解决方案。但不能同时使用这两种方法。

如果其他枚举的值不重要,可以这样做

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;            
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,         
    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;            
这样定义所有枚举值(如果添加新的枚举值,可避免更改其中一个枚举值)

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;            
因为第一个枚举值是0,而且默认情况下也是0,所以只需使用默认值。← 我误读了警告,这一点不是解决办法

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;            
和/或关闭MISRA规则检查

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;            

和/或,忽略特定注释。显然,你可以通过一个选项来实现。或者可能是<代码> -ESYM,只是尝试一下并检查文档。

< P>这当然不是C++的要求。
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;            
[C++11:7.2/2]:
带有
=
的枚举数定义为关联的枚举数提供常量表达式指示的值。如果第一个枚举数没有初始值设定项,则相应常量的值为零。没有初始值设定项的枚举数定义为枚举数提供通过增加前一个枚举数的值而获得的值 一个接一个

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;            
上面的语法允许多个枚举数具有初始值设定项

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;            

如果您被允许,也许您可以关闭此“MISRA 2004”规则的合规性检查。您也可以简单地忽略它,因为它看起来只是一个注释。就我个人而言,如果一直出现这种情况,我会有点恼火,但也许这只是我自己。

您需要遵守MISRA编码标准吗?如果不是,您可以忽略这一点。您没有调用可怕的未定义行为,并且通常会指定第一个元素的整数值,并理解其余元素将依次执行。除非警告符合您的要求,否则请忽略它。即使对于积极的静态分析来说,这也是一个相当奇怪的要求。也许米斯拉不明白什么是枚举数。@Lightness米斯拉以安全的名义强加了许多荒谬的规则;除非
var
\u Bool
,否则必须编写
if(var!=0){}
,而不是
if(var){}
。Ashwin:与MISRA警告相比,该代码存在更大的问题,
1BIT
不是有效的标识符。这会极大地改变其他名称的值,例如,使范围检查更加困难。而且由于您不知道枚举在代码的其余部分中是如何使用的,您不知道这些值是否重要。由于misra 9.3规则语句类似于:枚举器列表中的9.3(req),除非所有项都显式初始化,否则“=”构造不能用于显式初始化除第一个之外的成员。-1:删除第一个枚举器的初始化器将如何解决此问题?最后一个上的初始化器仍然会触发此条件。@LightnessRacesinOrbit:谢谢,我将注释/警告误读为“或仅第一个”(这对我来说没有意义),读为“或仅最后一个”(这非常有意义,使用最后一个作为最大值,用下一个倒数第二个初始化是一个常见的习惯用法)。这是一个有点奇怪的事情,即使是一个攻击性的静态分析器也会呻吟。忽略一个警告是不好的(最终你会得到很多并且错过严重的警告)-修正代码或沉默警告(如果你认为它没用的话)。使警告保持沉默。我当然不是建议忽略所有编译器警告。在这种情况下,只要开发人员决定可以将其静音,就可以发出这种非编译器警告。@DieterLücking的建议是明智的。如果你只是“忽略”警告,那么最终列表会变得如此之大,以至于你错过了重要的警告。如果可能的话,让特定的一个保持沉默,或者如果你不需要MISRA,让MISRA警告保持沉默。。。或者向日志文件发出警告,并将其grep以自动过滤掉不需要的内容,保留有用的内容。@DavidO我同意。我并不是在暗示别的。
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;