# 生成沒有行號標記的預處理文件
## 技巧
有時編譯程序會遇到如下類似的錯誤,
In file included from foo.c:15,
from a.h:45,
b.h:53: error: ... ...
如果錯誤是由于你所定義的一個很復雜的宏所引起的,你可能會需要先手動編譯生成相應的預處理文件,查看下預處理文件中的宏擴展代碼。比如,先運行
gcc -E foo.c -o foo.i
來生成foo.i預處理文件。然后,還可以嘗試手動修改、編譯這個預處理文件。
但是,由于生成的預處理文件中含有行號標記(linemarker),所以,運行
gcc -c foo.i -o foo.o
所得到的錯誤行號信息還是跟最初的一樣,如果可以將預處理文件中的行號標記都去掉,似乎會有些幫助。
幸好,gcc提供了這個選項:
> -P
> Inhibit generation of linemarkers in the output from the
> preprocessor. This might be useful when running the preprocessor on
> something that is not C code, and will be sent to a program which
> might be confused by the linemarkers.
運行
gcc -E -P foo.c -o foo.i
即可。
詳情參見[gcc手冊](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)
## 貢獻者
xmj
- 信息顯示
- 打印gcc預定義的宏信息
- 打印gcc執行的子命令
- 打印優化級別的對應選項
- 打印彩色診斷信息
- 打印頭文件搜索路徑
- 打印連接庫的具體路徑
- 預處理
- 生成沒有行號標記的預處理文件
- 在命令行中預定義宏
- 在命令行中取消宏定義
- 匯編
- 把選項傳給匯編器
- 生成有詳細信息的匯編文件
- 調試
- 利用Address Sanitizer工具檢查內存訪問錯誤
- 利用Thread Sanitizer工具檢查數據競爭的問題
- 連接
- 把選項傳給連接器
- 設置動態連接器
- 函數屬性
- 禁止函數被優化掉
- 強制函數inline
- 常見錯誤
- error: cast from ... to ... loses precision
- all warnings being treated as errors
- gdb無法調試gcc編譯的程序
- 其它
- 只做語法檢查
- 保存臨時文件
- 打開警告信息
- 指定語言類型
- 改變結構體成員的字節對齊