歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> UNIX痛恨者手冊:cpp預處理刪文件機制

UNIX痛恨者手冊:cpp預處理刪文件機制

日期:2017/2/27 17:44:56   编辑:Unix教程
手冊

寫一個程序, 例如a.c, 裡邊用了宏, 宏在別的目錄下的頭文件中定義, 用-I指定。

調試時, 發現宏替換存在問題, 於是用cpp查看預處理輸出, cpp也接受-I選項, 就象gcc一樣。 於是, 故事開始了:

1, cpp -I ……/headers/ a.c問題是, 我一下子忘了敲那個-I選項了!! 於是事實上的命令就是這樣:cpp ……/headers/ a.c輸出:cc1: error: headers/: 沒有那個文件或目錄

2, 我馬上意識到自己的錯誤操作, 更正為:cpp -I ……/headers/ a.c輸出:[root@localhost ~]# cpp -I ……/headers/ a.c cpp: a.c:沒有那個文件或目錄cpp: 沒有輸入文件

嗯? a.c也不見了? 不可能啊。 ls一下, 嘿, 還真的不見了! 百思不得其解, 用strace跟蹤一下cpp ……/headers/ a.c,看看它都干了些什麼:

3, strace cpp ……/headers/ a.c最後幾行的輸出:

QUOTE:vfork() = 4450 waitpid(4450, cc1: error: headers/: 沒有那個文件或目錄[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0) = 4450—— SIGCHLD (Child exited) @ 0 (0) ——stat64("a.c", {st_mode=S_IFREG|0644, st_size=0, ……}) = 0 unlink("a.c") = 0 exit_group(1) = ? CODE:NAME cpp - The C Preprocessor

SYNOPSIS cpp [-Dmacro[=defn]……] [-Umacro] [-Idir……] [-Wwarn……] [-M│-MM] [-MG] [-MF filename] [-MP] [-MQ target……] [-MT target……] [-P] [-fno-working-directory] [-x language] [-std=standard] infile outfile

Only the most useful options are listed here; see below for the remain- der.如果你不輸入 -I 的話,那麼第一個參數 ……/headers/ 是輸入文件,第二個參數 a.c 是輸出文件。

這樣你的文件就會被刪除。

和 gcc -o ttt.c ttt 的原理一樣,請看“UNIX 痛恨者手冊”,類似的還有

CODE:rm *.o因為 * 號需要按 shift 鍵,所以如果你的手指不太協調或者鍵盤不太靈光的話,按後面的小數點的時候,也許 shift 還沒有松開,於是就變成了

CODE:rm *>o恭喜你!

UNIX 將刪除你所有的文件,並且為你生成一個名為 o 的空文件。

Copyright © Linux教程網 All Rights Reserved