編譯問題 case expression not constant

最近遇到了一個宏:

#define crReturn(z) /
do {/
crLine=__LINE__; return (z); case __LINE__:;/
} while (0)

用VS2003編譯的時候,提示 error C2051: case expression not constant
按照宏替換的道理,__LINE __應該是會換成行號,是整數常量啊,沒有問題啊,怎麼會提示不是常量呢。

想了半天沒解決,到網上搜了個答案:編譯器配置的問題,只需要在編譯配置頁C++/general/debug info format中設置爲/Zi,不使用/ZI,就可以了。原文鏈接:http://www.codeguru.com/forum/archive/index.php/t-198413.html

原文說是VC的bug,想了下,不知道算不算BUG,可以這樣解釋:

因爲使用/ZI表示編輯並繼續運行,所以__LINE__應該可以中途變動,必然不能是常量,
而case要求__LINE__在編譯之前就決定爲常數,不能是動態修改的,這樣兩者就相沖突。

可能編譯器沒有把__LINE__直接變成整數常量,而是一個變量,這樣只能滿足/ZI的要求,這樣就不能滿足case的要求的常量。

不知道VC怎麼設計的,就只能猜到這種程度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章