首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Bash實現C代碼行數統計:從粗糙腳本到工業級工具的演進之路

     編輯:關於C語言

需求背景

快速統計C/C++項目有效代碼行數(排除空行、註釋),是代碼審計、工作量評估的常見需求。本文分析一個Bash腳本的實現邏輯,揭示其局限性,並給出生產級替代方案。

原腳本邏輯分析

處理流水線

  1. 刪除空行:sed '/^[[:blank:]]*$/d'
  2. 刪除單行註釋行:sed '/^[[:blank:]]*\/\//d'
  3. 處理多行註釋 /* ... */:
    • 提取所有/*行號 → start.txt
    • 提取所有*/行號 → end.txt
    • paste合並配對
    • 逐對sed '${START},${END}d'刪除
  4. 統計剩餘行數:wc -l

致命缺陷

/* 註釋開始 */ int x = 1; /* 註釋結束 */
printf("hello"); /* 行內註釋 */

無法處理同一行包含代碼和註釋的情況,會誤刪有效代碼。且grep -n只匹配行首模式,漏掉縮進的註釋。

進階方案:狀態機方法

用awk實現單遍掃描狀態機,正確處理嵌套、字符串字面量、行內註釋:

awk '
BEGIN { in_block=0; in_string=0; in_char=0; count=0 }
/\/\*/ && !in_string && !in_char { in_block=1; gsub(/\/\*.*\*\//,"") }
/\*\// && in_block && !in_string && !in_char { in_block=0; gsub(/.*\*\//,"") }
in_block { next }
/\/\// && !in_string && !in_char { gsub(/\/\/.*/,"") }
/^[[:space:]]*$/ { next }
{ count++ }
END { print count }
' "$1"

工業級工具推薦

工具語言特性安裝
clocPerl多語言、報告豐富、並行處理apt/yum/brew install cloc
sccGo極快、Git感知、複雜度估算go install github.com/boyter/scc@latest
tokeiRust高速、彩色輸出、JSON導出cargo install tokei
LOCRust簡單、標準輸出、CI友好cargo install loc

最佳實踐建議

  • CI/CD集成:用cloc --json生成機器可讀報告
  • 增量統計:git diff --numstat配合cloc --diff
  • 排除生成代碼:--exclude-dir=generated,protobuf,third_party
  • 區分類型:分別統計頭文件、源文件、測試文件

總結

Bash腳本適合臨時小規模統計,但面對真實項目的複雜語法(字符串內/*、行內註釋、嵌套註釋、預處理指令)無能為力。現代專用工具基於完整詞法分析,準確度與速度雙贏。建議團隊統一接入cloc或scc到構建流程,獲得可信的代碼度量基線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved