2010-06-21 138 views
3

我在項目中有很多「笨」#define,我想刪除它們。不幸的是,我不能做一個簡單的搜索和替換,因爲#define被參數化。例如:有沒有辦法'擴展'#define指令?

#define FHEADGRP(x) bool _process_grp##x(grp_id_t , unsigned char) 

這是用來生成幾個函數的標題。我想以某種方式執行與預處理器相同的操作 - 根據其結果替換宏的每個調用(插入正確的參數)。我希望你明白我想做什麼。

我發現使用Visual Studio ,可以使用/ P選項獲得預處理的中間文件,但不幸的是,這並不能幫助我,因爲文件被數千行其他行「污染」,並且所有的#define都被擴展了,我不想這樣做,我只是想擴展一些宏,最好是在我的IDE(這是Visual Studio)中做到這一點。有沒有辦法如何實現這一點?

回答

3

是的,有 - 因爲你使用Visual Studio。

Visual Studio IDE有一個強大的搜索&替換機制。你似乎認爲它只能處理文字字符串。它可以做更多。點擊Ctrl - Shift - H用於全局搜索和替換。在「查找選項」中,選擇「使用:通配符」。

現在,通過bool _process_grp\1(grp_id_t , unsigned char)

通配符爲*,並\1是反向引用替換FHEADGRP(*)

宏在標記源上工作,但搜索&替換字符。這可能會導致一個小問題。考慮案例FHEADGRP(Foo)FHEADGRP(Foo)。對於C宏,它們是等效的,但在第二種情況下,反向引用將擴展到Foo - 帶有空格。

解決方法是使用正則表達式,特別是用bool _process_grp\0(grp_id_t , unsigned char)替換FHEADGRP\(:b*(.*):b*\)。我發現VS2005的實現有點bug。例如簡單的?表達式無法匹配單個空間。但上面的例子應該可以工作。

+0

謝謝!我真的沒有足夠的探索這個功能。謝謝,這比寫我自己的Perl腳本要好得多! – PeterK 2010-06-21 12:15:02

7

你通常可以得到預處理器的輸出與gcc -E(假設你'當然,使用gcc,雖然其他編譯器te找到相同的功能)。

當然,處理該文件以自動將#define的文件擴展爲其他文本並不是一項簡單的任務。我可能會編寫一個shell腳本(或者Perl,因爲在我看來,它更好地處理文本)來自動執行任務。


在Visual Studio中,您可以使用/P執行相同的操作。這可以在IDE中根據this page進行設置。

+0

謝謝你的回答。由於我使用的是視覺工作室(在標籤中說過,但我忘了在提問中提到),這並沒有多大幫助。你知道一個簡單的方法如何使用這個IDE做到這一點?或者我將不得不使用Perl? (這是一個不錯的主意,但涉及更多的編碼......) – PeterK 2010-06-21 07:50:57

+0

請參閱http://stackoverflow.com/questions/277258/cc-source-file-after-preprocessing瞭解如何使用visual studio執行此操作 – nos 2010-06-21 07:58:43

+0

已經發現,但正在尋找更清晰的方式(只擴展一個宏...)。無論如何,感謝您的答案,我可能會去perl;) – PeterK 2010-06-21 08:04:14

相關問題