你沒遇過的編譯器鬼打牆,許功蓋問題

我想在前面的文章裡很多人可能都沒遇過所謂的鬼打牆,大學四年中我遇到最多鬼打牆的狀況全是Dev C++引起的,其實如果都一一記下來應該是個很長的列表,只是問題解決通常我自己也忘記了,其中一個我印相最深刻的鬼打牆問題不是由Dev C++引起的,而是Visual C++ 6.0引起的,程式碼大略像這樣

class SocketHandler {
    // 此函數會被呼叫以通知連線成功
    void onConnectionSuccess();
};

void SocketHandler::onConnectionSuccess() {
   // some code here
}

這是我自己寫的一個socket連線程式,不管怎麼試,編譯器總會跟我抱怨它不認識onConnectionSuccess這個函數,從表面上看起來程式也沒有任何問題,所以問題到底出在哪裡? 答案是許功蓋問題,看到了嗎? 註解的最後一個字是”功”,而我們知道”功”在 big5 其中最後一個字元是 “/”,且VC6不懂得unicode,它會以ASCII的方式來處理程式碼,所以程式碼就變成

// 此函數會被呼叫以通知連線成 
void onConnectionSuccess();

如此一來,註解就被延伸到了下一行,onConnectionSuccess的宣告就因為這樣被忽視掉了,為了找到這個問題,我重讀了好多次程式碼,都找不到任何缺陷,一整天的時間就花在這個上面

這個故事告訴我們什麼?

從此之後我就強迫自己改用英文寫註解,我想沒有多少人有機會遇到這問題,而誰也想不到註解也會造成程式的編譯問題,這個故事告訴我們,工具的好壞遠比你想像重要,不要以為這種缺陷沒什麼,事實上是那些缺陷可以讓你debug一整天都找不到原因,除了你的工作時間浪費了,學習的時間更是浪費在其中,更慘的是還帶來了嚴重的挫折感,再一次,工欲善其事,必先利其器,學習更是如此

This entry was posted in C/C++, 中文文章. Bookmark the permalink.

5 Responses to 你沒遇過的編譯器鬼打牆,許功蓋問題

  1. Y.C says:

    用英文寫註解很好, 中文其實如果用 UTF8 做編碼, 就不會到這一類問題, 因為 UTF8 有避開一些 ASCII 碼. 最慘的是我遇到一位, 他用的編輯器不知援 UTF8 只支援 Big5, 然後這位程式設計師的生產力還算是很不錯的…

  2. khdreamer says:

    我個人也是用英文註解的
    沒有特別原因,單純是懶得切換成中文
    沒想到竟然還有這樣的編譯器問題存在XD

    • Jack says:

      本人同样因为懒得切换IME而使用英文注解……我是不是应该庆幸大陆这边的编码没有像BIG5一样有那么严重的缺陷XD

  3. 羊子 says:

    其實在行末加一個標點符號 “.” 或是 “,” 就可以避掉這個問題了.
    不必硬是用英文寫註解.

    不過話說回來, 順道練英文也不錯啦 ^_^

  4. These are genuinely wonderful ideas in concerning blogging.
    You have touched some pleasant points here.
    Any way keep up wrinting.

    Visit my page – info garcinia cambogia premium