Compiler Warning C4819 (C++)
用了 Microsoft Visual Studio 2005 之後本來還覺得不錯,沒想到這幾天為了要安裝 Boost library,終於出問題了。
首先照著說明文件打指令,bjam 要先安裝就是了。當然這些都不是什麼大問題,不過裝著裝著問題就來了,怎麼會有一堆 warning C4819 咧?本來是不以為意啦(誰會想要去理 warning 啊),不過美好的一切就在 Visual Studio 2005 告訴你找不到 regex library 時破滅了!!!
追根究底,這樣出現 C4819 warning 的檔案,如果直接去開,那麼會發現裡面有亂碼。亂碼問題不大,問題是有些會影響到 compiler 的判斷。也就是原來放在註解的某些字元一下子就變成 code 了,所以 boost 在安裝的時候就少了幾個 library 沒放上去,也造成了 regex 沒法用(其實我只要用 regex 而已,其他的我不清楚)!
因為字碼(codepage)都亂了,本來用 vim/notepad 開啟後另存為 Unicode 模式也沒用(因為打開時就爛了)。現在有想到一個白痴的方法,就是找台 FreeBSD 機器,用它來幫我轉換(用 vi/vim 開檔雖然也有亂碼,不過按 ga 時 hex 值還是對的)。正在試….
Updated: 上面的方法還是不行,現在用鋸箭法解決了,把有問題的 /* ? */ 砍掉,反正註解我也看不到,也不用懂了。











三月 8th, 2006 at 9:41 am
要不要先把 project 的語系改成 non-unicode 看看? Properties -> General -> Character set -> Not set 或是 Use multi-byte character set…
三月 8th, 2006 at 10:06 am
唔,問題不是 project setting,是因為 bjam 會去呼叫 VC 的 compiler ,啊這裡就會有問題了。因為那個 lib*.lib 或 *.lib *.dll 這些函式庫就會有缺了。
三月 8th, 2006 at 10:57 am
C4819 我最近也碰到了,請參見我這篇筆記:《Subversion Issue 2332: Keyword expansion in non-UTF8 documents results in mixed charsets》,剛看了一下,boost 是用 CVS,不確定 CVS 是不是也有像 Subversion 這樣的問題存在。不過,我想問題應該不是出在 C4819 上,warning 理論上不會阻擋後續的 compile/link。
建議要用 regex 的話,PCRE 稍微方便些。Boost.Regex 太 C++ oriented 了,所以繼承了眾多的 C++ 原罪,尤其是身處 boost 這個「逞技」味極濃的 library,更是麻煩,若有需要 porting 的話,會哭到死。
不過用 PCRE 的話,轉碼、算位置、以及 replace 等都要自己稍微包一下,剛開始用時會比較辛苦就是了。:-)
三月 8th, 2006 at 11:02 am
嗯,jeffhung 你的建議不錯,不過我在 Win32 上習慣用 boost 囉,所以要換也很麻煩,剛也 upload 一張 screenshot 在 flickr 上,可以看到在 Windows 下之所以不能生出 library 的原因為是因為會誤判註解啦
三月 8th, 2006 at 1:59 pm
VC compiler 在以前就很奇怪,如果程式碼開頭有 BOM 就沒問題,但是 VS IDE 在存檔時卻又會把 BOM 拿掉。
十月 3rd, 2006 at 12:25 pm
I just found there is a software “FAR”, which can convert ansi files to unicode files. I have compiled the library with vc++ 2005 successfully after doing the conversion.
http://www.helpware.net/FAR/help/Unicode.htm
十月 3rd, 2006 at 10:21 pm
Hi luoge, Thank you for your information.