2012-10-15 72 views
0

假設您有一個枚舉類型,其值爲50+個條目。有些時候我已經在這個數量的條目中切換/包含了一個枚舉值,但只是爲了檢查2到5個條目。例如,OpenGL將其大多數枚舉枚舉在一個枚舉類型中,稱爲GLenum。這些值的範圍從GL_VERTEX_SHADERGL_STREAM_DRAWGL_TRIANGLESGL_ARRAY_BUFFER使用枚舉關閉開關/ case語句的編譯器警告

正如你所看到的,而這些都是在大局觀方面有關,他們將被用於不符合彼此相關的上下文。

我在Linux中的MinGW/GCC上生成警告,其中每個警告在之間,每枚舉值在其類型聲明中列出。我不確定這是否發生在VC++上,但我想我會考慮它以防萬一。

換句話說,所產生的警告數量TotalEnumValues - AmountOfCaseStatements每個枚舉值,提供了不是所有的枚舉已經在語句本身,這可以容易導致100+編譯器警告,如果你的枚舉類型包含在被佔至少100個條目。我經常使用if/else來適應這種情況,但是當檢查枚舉值不僅僅是一個條目(這實際上很少見,因爲枚舉的目的通常需要條件邏輯來表達它) ,我總是傾向於使用開關/外殼,因爲我覺得它更美觀(即使它只是編譯成if/else語句))

那麼,這個警告是否可能關閉?如果是這樣,怎麼樣?

回答

8

添加一個default:案件,什麼都不做。編譯器會看到你正在「處理」所有的可能性(從而除去警告),但是如果你沒有爲它指定任何動作,它將不會改變所有生成的代碼。


澄清:我說的是這樣的:

switch(a) 
{ 
case CONSTANT_1: 
     ... 
    break; 
case CONSTANT_2: 
     ... 
    break; 
} 

VS此:

switch(a) 
{ 
case CONSTANT_1: 
     ... 
    break; 
case CONSTANT_2: 
     ... 
    break; 
default: 
} 

第二個在所有不修改行爲,所以編譯器不應該改變生成的代碼,但會告訴它你沒有忘記其他(im)可能的情況。

+1

至少在VC++中,添加一個空的'default'情況可能會影響代碼生成,但它有['__assume'](http://msdn.microsoft.com/zh-cn/library/1b3fsfxw (VS.100).aspx)只是爲了這個目的。 – ildjarn

+0

@ildjarn編譯器總是可能做一些完全沒有意義和愚蠢的事情,但是僅僅打破默認就意味着缺省缺失...... __assume在這種情況下是無用的。 –

+1

@JimBalter:對'__assume'的看法並不遵循邏輯上的前提。在這裏其實很有用;它告訴編譯器該變量的值不能是'switch'語句中的值。這是現代優化器非常有用的信息。 – MSalters