我需要調試一大堆宏的C代碼,其中一些宏根本不重要,它們包含幾條(很多)行。這使得調試變得不可能,因爲宏是在一行中擴展的,你永遠不知道錯誤來自哪裏。另一方面,使用sed
可輕鬆獲得預處理器輸出,並在每個分號後添加行。添加編譯器階段
我不會討論如何使用這樣的宏來做一個好的練習,因爲我對此沒有太多的瞭解。但是我想知道在預處理和編譯之間是否可以向編譯器添加一個階段(我使用幾個編譯器:icc,gcc,xlc),所以我發現sed
命令。
我需要調試一大堆宏的C代碼,其中一些宏根本不重要,它們包含幾條(很多)行。這使得調試變得不可能,因爲宏是在一行中擴展的,你永遠不知道錯誤來自哪裏。另一方面,使用sed
可輕鬆獲得預處理器輸出,並在每個分號後添加行。添加編譯器階段
我不會討論如何使用這樣的宏來做一個好的練習,因爲我對此沒有太多的瞭解。但是我想知道在預處理和編譯之間是否可以向編譯器添加一個階段(我使用幾個編譯器:icc,gcc,xlc),所以我發現sed
命令。
現在,我會嘗試使用我在this post中發現的內容。我也嘗試了用於編譯單個文件的包裝選項,並且目前它還是有技巧的。在包裝器中,我預處理(使用-E)文件,然後使用sed
和一些規則處理預處理文件,然後編譯它。
你可以做的是運行預處理器只(-E):
$ g++ -E in.c -o in.i
然後運行sed腳本,並編譯它與G ++(無-E這個時候)輸出。我敢肯定,你可以在你的Makefile中構建一個完成所有這些的規則。
定義你自己的「編譯」的腳本運行g++ -E
,那麼你的sed
-mangler,然後g++
,並指定一個整體的編譯器。請注意使用mktemp
提供的臨時文件,所以同時開始編譯(make -j
)不會搞砸了。
(今天的GCC沒有單獨的預處理步驟了,所以注入的東西還有不易反正來完成。)
是的,我可以,但也有很多的Makefile,並會改變規則。我想知道是否有辦法專門告訴編譯器在編譯階段和其他編譯階段之間做些什麼。 – 2013-04-09 15:02:17
我不認爲gcc有這樣的事情,也許其他編譯器確實擁有它。 – piokuc 2013-04-09 15:12:04
@Genís,一個標準的技巧是使用一個包裝腳本,它會調用'g ++'兩次,爲第一次運行添加'-E'並更改'-o'文件名。 – 2013-04-10 16:38:37