我想用一個內聯函數來代替更換的#define
#define INTERVAL_MASK(b) (1 << (b))
。
int INTERVAL_MASK(int b)
{
return (1 << b);
}
但我有一個switch case
,它使用在case
陳述預處理指令。如何去轉換這個?用if
代替switch
是唯一的選擇?
我想用一個內聯函數來代替更換的#define
#define INTERVAL_MASK(b) (1 << (b))
。
int INTERVAL_MASK(int b)
{
return (1 << b);
}
但我有一個switch case
,它使用在case
陳述預處理指令。如何去轉換這個?用if
代替switch
是唯一的選擇?
開關盒標籤必須有一個整型常量表達式,所以你不能在case標籤中進行函數調用。
對此使用宏沒有任何問題。
如果您真的關心使用宏,#define
它恰好在switch語句之前,#undef
它緊跟在switch語句之後。
在C++ 0x中,您將能夠創建constexpr
可用於常量表達式的函數,但據我所知儘管編譯器實際上完全不支持C++ 0x的那部分內容。
爲什麼不是const int interval_mask = (1 << b);
?
需要注意switch語句一個重要的事情是那麼回事值可能只是整型常量表達式。
我能想到的唯一解決方法就是一堆if-else語句。或者,您可以通過編程從2(1 < < 1)到1024(1 < < 10)或無論您的限制是多少,都可以生成這些情況。意思是你的switch語句看起來像這樣:
switch(i) {
case 2:
//random stuff
break;
...
case 1024:
//random
break;
...
}
將會有一個單獨的代碼來生成這個。實際上並不會那麼難。
據我所知,包含控制語句(如switch,if和loops)的函數沒有內聯。
如果您使用宏,您可以確定。
大概是因爲'b'在不同的地方有不同的值。 – 2010-10-04 16:00:00
@therefromhere:但是,如果OP當前在switch語句中使用它們,則每一個都需要是編譯時常量。 – 2010-10-04 16:02:14
該OP可能用於'case INTERVAL_MASK(2):',case INTERVAL_MASK(17):',... – DarkDust 2010-10-04 16:08:15