VS2015寫C++莫名檢測到大括弧不匹配的奇葩問題如何解決?

題主軟體工程大一學生,最近有個同學跑一段代碼總是報錯,類似於「大括弧不匹配」之類的錯誤,來讓我幫忙看看。

我仔細地檢查了那一段代碼,無論哪裡都沒有找到問題。雙擊錯誤信息,編譯器(VS2015)跳轉到那一行根本沒有大括弧。

於是我用死辦法,把文件里的函數一個接一個注釋掉,然後編譯檢查問題。鎖定了錯誤肯定出在某個函數里:

這就是那段注釋掉才可以編譯成功的代碼。因為注釋掉這段代碼編譯就沒問題了,所以錯誤一定出現在這裡。

然而我仍然沒有檢查出任何問題。於是我建立了一個新工程,複製了這個函數實驗。結果如下:

一個簡單的佔位函數,編譯正常,不報錯,現在換成上面那段代碼

題主確認已經仔仔細細檢查過了,絕對不存在全形大括弧的問題,因為所有的大括弧、中括弧、小括弧都是半形符號。

但是我把這個函數截屏下來,然後一個字也不差地重新寫一遍,編譯卻成功了。

後來我們發現了更詭異的現象:

這段錯誤代碼直接發文件吧……

http://vdisk.weibo.com/s/de8VPy5T0auL7

求大神解釋一下,這究竟是什麼情況?如果真是字元的問題,為什麼在寫程序的時候VS沒有報錯,而編譯運行的時候卻報錯了呢?


你的換行符有問題,以至於VC認為後面的一堆代碼在同一行,這種情況下//清除緩衝區 這句注釋導致了後面的代碼一起被注釋掉,所以最後你的代碼實際上只剩下

bool user_say_yes() { char c; cout &<&< "(y, n) ? " &<&< flush;

具體換行符是丟了
還是丟了
我就沒細看了…… 你刪了所有的換行重新換一遍應該就好了,在保存的高級選項里 指定換行符 也許也可以解決問題。


把出錯代碼保存成utf-8+bom格式試試,我以前也遇到過這種問題不是換行符的錯,是你的中文注釋字元導致的,去掉中文注釋也可以


我猜你那段有問題的代碼是在Mac下寫的,然後保存直接複製進了win下,這樣有個問題。

在Windows中,使用「回車CR("
")」和「換行LF("
")」兩個字元作為換行符。Windows系統裡面,每行結尾是 回車+換行(CR+LF),即「
」。Mac系統里,每行結尾是 回車CR 即"
"。

所以在Mac下寫的換行移到win中就失效了,而VS顯示時可能恰好能將"
"當作為換行。但進行語法檢測時就不一定了。

那個大括弧的問題其實跟VS語法檢測的演算法有關,比如匹配大括弧時不在同一行內匹配,上面所有代碼背後都在一行,這就導致大括弧匹配的失敗。(這只是一種可能會導致這種問題的語法檢測演算法)

ps:我是你同學,,猜我是誰

另外知乎真的不是程序員論壇啊!


用notepad++看了看,換行符有問題。Windows下的換行應該是CRLF,也就是"
"。有些地方只有CR

轉換一下行尾格式,或者換個正常點的編輯器把代碼重新打一遍就好了

另外這個void main()是看著老譚的書寫的嗎。。。


其他人已經說了換行符的問題了,我來解答一下為什麼編寫沒問題編譯出錯

因為智能提示和編譯器用的是兩套不同的系統,不完全一樣


這種奇葩問題我也遇到過,一般複製文本尤其是代碼最好先複製到notepad,確保格式正確再從notepad複製到IDE


換行符問題

還好我有全部源代碼UTF-8+Unix換行符的好習慣


這種情況就應該vimdiff


我猜測是中文注釋導致下一行代碼被當做同一行注釋掉了,出現這種問題的原因可能是你的源文件保存的格式是不帶bom頭的utf-8,改成帶bom頭試試.

順便說一種處理各種"奇葩編譯錯誤"的方法:可以使用/E選項或者在c/c++選項里開啟預處理到文件,因為預處理後的translation unit才是編譯器真正編譯的東西,在這裡你應該會發現代碼哪裡錯了,授人以魚,不如授人以漁,:)


其他答案正解。原來我用CLion和VS同時編輯一段代碼中間有個注釋,然後VS就爆炸了表示並不知道我在寫什麼...


總算大概知道我的程序為什麼出錯了....同mac copy到win。。。不過我是直接打開的文件...


先粘到記事本再複製


推薦閱讀:

有哪些使用Visual Studio 的好習慣或者小技巧?
你覺得什麼樣的程序員才有資格被稱作【碼農】?
為什麼 Visual Studio Emulator for Android 那麼流暢?
如何看待VS繁長的安裝和卸載過程以及卸載不徹底問題?難道微軟沒辦法優化這個過程嗎?

TAG:編程 | MicrosoftVisualStudio |