2016-07-14 16 views
0

說我有一個翻譯文件TARGET定義爲FEATURE定義:保持include語句在預處理輸出

// File options.h 
#ifdef TARGET_A 
#define FEATURE_X 
#endif 
#ifdef TARGET_B 
#define FEATURE_Y 
#endif 
struct foo { 
    int a; 
    int b; 
}; 

而且我有一堆文件ifdef「與FEATURE ED定義:

// File foo.c 
#include "options.h" 
#ifdef FEATURE_X 
int x; 
#endif 
#ifdef FEATURE_Y 
int y; 
#endif 

那麼,我如何預處理foo.c,以便它將處理include語句,但將它保存在文件中?

喜歡的東西:

$ some-pre-process-tool -DTARGET_A -I. -o foo.pp.c foo.c 
$ cat foo.pp.c 
// File foo.c 
#include "options.h" 
int x; 
$ 
+0

你可以可能會使用[coan](http://coan2.sourceforge.net/)獲得您所需的內容(儘管可能不那麼容易)。祝你好運。 – rici

+0

我看到,當谷歌搜索解決方案 - 但它看起來像一個太大的努力,爲此目的。你使用/瞭解它,對這種事情有好處嗎?我問,因爲我最終解決的解決方案是刪除隨機空白,這是討厭的... – Allan

+0

我已經使用了科恩,它已經解決了我設置要解決的問題。我不知道解決問題有多容易:我認爲你需要兩個步驟,首先確定該特徵定義了目標選擇的結果(只要您有一種通過名稱識別相關特徵宏的方法),然後使用coan選擇性地僅處理這些宏。 – rici

回答

-1

恐怕預處理文件可以包含#裏面只有char或字符串文字並在輔助線記錄的開始。

2

首先,爲什麼要在預處理代碼中保留#include?你打算再次通過預處理器來運行它,還是隻有在讀取結果時纔有幫助?

你可以得到你想要的與gcc標誌-Wp,-dI-dI這裏記載:https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#index-dI-1113

注意,輸出文件也將#include的從你包含的文件和所有的孩子#include內的。

+0

好吧,我的不好,我不夠具體......我不想在輸出中看到包含文件的內容。我已經更新了這個例子來反映這一點。僅供參考:我想要這樣做是因爲我想了解一些以許多不同變體編譯的代碼,並且我希望看到差異。 – Allan

+0

你不想看到內容,但你仍然想要使用包含文件中的#define,是否正確? –

+0

不,我對查看定義不感興趣。我只對預處理器評估定義感興趣。 – Allan

0

有這樣做的正確的更好的方法 - 但我最後寫的是從cpp

#!/usr/bin/env ruby 
# File: pp.rb 

f = open("| cpp -C -dI #{ARGV.join(" ")}") 

# First line 
f.gets =~ /"([^"]+)"/ 
file = $1 
ll = [] 

# Skip "invisible" includes 
while l = f.gets 
    if l =~ /^#\s*1\s*"#{file}"$/ 
     ll = [] 
    else 
     ll.push l 
    end 
end 

inc = false 
skip = false 
skip_line = nil 
ll.each do |l| 
    if inc and l =~ /^#\s*(\d+)\s*"#{file}"$/ 
     inc = false 
     skip = true 
     skip_line = $1.to_i 
    elsif skip and l =~ /^#\s*(\d+)\s*"#{file}"/ 
     inc = false 
     if $1.to_i == skip_line + 1 
      skip = false 
     end 
    elsif skip 
     inc = false 
    elsif l =~ /\s*#\s*include/ 
     puts l 
     inc = true 
    elsif l =~ /^#\s*(\d+)\s*"#{file}"/ 
    else 
     inc = false 
     puts l 
    end 
end 

處理輸出,我可以這樣調用一個小包裝腳本:

$ ./pp.rb -DTARGET_A -I. foo.c > foo.pp.c 
$ cat foo.pp.c 
// File foo.c 
#include "options.h" 

int x;