2010-10-04 50 views
1

我想用一個內聯函數來代替更換的#define

#define INTERVAL_MASK(b) (1 << (b)) 

int INTERVAL_MASK(int b) 
{ 
    return (1 << b); 
} 

但我有一個switch case,它使用在case陳述預處理指令。如何去轉換這個?用if代替switch是唯一的選擇?

回答

6

開關盒標籤必須有一個整型常量表達式,所以你不能在case標籤中進行函數調用。

對此使用宏沒有任何問題。

如果您真的關心使用宏,#define它恰好在switch語句之前,#undef它緊跟在switch語句之後。

在C++ 0x中,您將能夠創建constexpr可用於常量表達式的函數,但據我所知儘管編譯器實際上完全不支持C++ 0x的那部分內容。

0

爲什麼不是const int interval_mask = (1 << b);

+1

大概是因爲'b'在不同的地方有不同的值。 – 2010-10-04 16:00:00

+0

@therefromhere:但是,如果OP當前在switch語句中使用它們,則每一個都需要是編譯時常量。 – 2010-10-04 16:02:14

+1

該OP可能用於'case INTERVAL_MASK(2):',case INTERVAL_MASK(17):',... – DarkDust 2010-10-04 16:08:15

0

需要注意switch語句一個重要的事情是那麼回事值可能只是整型常量表達式。

我能想到的唯一解決方法就是一堆if-else語句。或者,您可以通過編程從2(1 < < 1)到1024(1 < < 10)或無論您的限制是多少,都可以生成這些情況。意思是你的switch語句看起來像這樣:

switch(i) { 
    case 2: 
     //random stuff 
     break; 
    ... 
    case 1024: 
     //random 
     break; 
    ... 
} 

將會有一個單獨的代碼來生成這個。實際上並不會那麼難。

0

據我所知,包含控制語句(如switch,if和loops)的函數沒有內聯。

如果您使用宏,您可以確定。