統計C/C++程式碼行數
阿新 • • 發佈:2018-11-22
近日在寫一個統計專案中C/CPP/H/CC/HPP檔案(C/C++程式碼檔案字尾名)的小程式。目標是給定一個專案程式碼所在資料夾,統計出總程式碼行數、有效程式碼行數、註釋行數、空白行數。
其中:總程式碼行數 =(有效程式碼行數+註釋行數+空白行數)
每找到一個目的碼檔案,就建立任務投進執行緒池裡,執行速度很快,不過統計結果偶有不準。程式跟蹤下來,碰到類似下面的多種註釋風格混用以及巢狀註釋的程式碼很難正確處理。
1 std::string comment_test = R"({ 2 // comment /* with nested comment */ 3 "a": 1, 4 // comment 5 // continued 6 "b": "text", 7 /* multi 8 line 9 comment 10 // line-comment-inside-multiline-comment 11 */ 12 // and single-line comment 13 // and single-line comment /* multiline inside single line */ 14 "c": [1, 2, 3] 15 // and single-line comment at end of object 16 })";
conmment_test裡存的是原始字串,實際上存放的內容是
就是說裡面的// 和/* */註釋符號不能被當成註釋符號納入統計。但如何識別出原始字串,找出字串頭尾,比較困難。有人會問了,這不是很明顯嘛,R"()",括號裡放的就是原始字串內容。問題在於這段程式碼是單獨拿出來的,一旦放在程式碼檔案複雜的上下文中,就不容易識別了。
以前看過一篇文章,講註釋只能用//,而不要用/* */,更不要用巢狀的/* */,這會讓文字分析程式無從下手,總算是有體會了! 如果註釋用//開頭,非常容易就識別該行程式碼就是註釋了。
寫這個小程式時,遇到幾個坑,在這裡記下來
1. windows 控制檯程式輸入路徑時,路徑不能包含空格,不然cmd被把空格前後內容當作不同的引數,解決辦法路徑用雙引號包含起來
2.windows控制檯程式中文亂碼問題,工程設定是unicode,程式列印的檔案路徑含中文,而控制檯預設內碼表是936,GBK,開發環境和輸出環境編碼不一致,所以會亂碼。
解決方法使用就是setlocale(LC_CTYPE, "");