用 awk 脚本过滤 C99 标准支持的单行注释(“// ...”)和块注释(“/*...*/”),并且当单行注释以“\”结尾时也可以跨多行。
- # filename: strip_c_comment.awk
- # issue: awk -f scrip_c_comment.awk test.c
- BEGIN { FS="" }
- !(ignore_line && $NF == "\\") && !ignore_line-- {
- ignore_line = 0;
- for(i = 1; i <= NF; i++) {
- if (ignore_block) {
- if ($i $(i+1) == "*/") {
- ignore_block = 0
- i++ # remove '*'
- }
- continue
- }
- if (!instr && $i $(i+1) == "/*") {
- ignore_block = 1
- i++ # remove '/'
- continue
- }
- if (!instr && $i $(i+1) == "//") {
- ignore_line = ($NF == "\\")? 1: 0
- break
- }
- if ($i == "\"") {
- instr = 1 - instr
- }
- printf($i)
- }
- printf("\n")
- }
调用预处理器 cpp 来过滤
- sed 's/^#/@/' main.c | cpp | sed -e '/#/d' -e 's/@/#/'