以下是我們的代碼庫中的典型情況。scanf()與C++枚舉
enum ConfigOption { CONFIG_1=1, CONFIG_2=2, CONFIG_3=3 }
ConfigOption cfg1, cfg2;
sscanf(s, "%d", &cfg1);
這是一個內部使用的仿真軟件。未分配。易於維護和正確性非常重要。可移植性和用戶界面 - 不是真的。
問題是在C++中enum
不一定是int
。所以我們得到一個編譯器警告,並且在使用不同的編譯器或啓用優化時可能會得到不正確的行爲。
一種解決方案是將&cfg
投射到int*
。但是,這並不能解決編譯器決定將int
以外的內容分配給enum
的情況。
所以我建議採取以下解決辦法:
template<typename T> inline
int& eint(T& enum_var) {
assert(sizeof(T) == sizeof(int));
return (int&)enum_var;
}
現在一個使用scanf
如下:
sscanf(s, "%d", &eint(cfg1));
我很願意聽取意見和其他(更好的)解決方案的上述問題。請記住,其中一個目標是保持代碼簡單。這不是'生產質量'的東西,你添加得越多 - 維護就越困難。
在編譯時,我會建議一個靜態(編譯時)斷言(例如'BOOST_STATIC_ASSERT'),所以如果大小不正確,你會得到一個* compiler *錯誤。如果你這樣做,你可以找到有問題的枚舉,並使用下面的Nils的建議來修復它。 – UncleBens 2010-08-08 09:51:14