2016-01-20 88 views
2

在工作中,我們使用GNU CPP作爲自定義語言的預處理器。預處理器下游的流程理解線標記(形式爲# 123 foo-bar.extension),並將其信息嵌入最終編譯的源代碼中。重載線路標記文件名

這一切都非常好,但整個過程的工作原理是把每件事寫到一個臨時目錄和它的輸入部分(預)預處理遞給CPP之前。此轉換不會更改行號。因此,CPP會調用my-tmp-dir/foo.input-pp表單的文件,並且該名稱最終嵌入行標記中。我希望能夠欺騙一些東西,以便CPP輸出original/path/foo.original.input表格的行標記。

CPP是否有任何命令標誌,它可以讓我做到這一點?

+0

你能給一個非常基本的輸入,預期的輸出,你做了什麼讓這個預期輸出的例子,你實際拿到呢? – mikedu95

+1

編寫一個名爲'foo.c'的空文件,並用'gcc -E foo.c'對其進行預處理。你會看到提及'foo.c'的行標記。我想告訴CPP他們應該真的說'bar.c' –

回答

3

我不知道這方面的任何選項,但你不能用一個簡單的sed命令來更改行標誌?

sed -e '/^#/s,my-tmp-dir\(.*\)-pp,original/path\1,' 

另外,放線指示作爲轉換源的第一行,以便CPP知道文件名是:

#line 1 "original/path/foo.original.input" 

行指令正常工作。此文件:

#line 1 "bar.c" 
int test1; 
#include <sys/syscall.h> 
int test2; 

進行預處理到:

# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "foo.c" 
# 1 "bar.c" 
int test1; 
# 1 "/usr/include/sys/syscall.h" 1 3 4 
# 3 "bar.c" 2 
int test2; 

foo.c的記載仍然存在,但立即被bar.c覆蓋。

+0

sed選項可以工作,但我希望能夠直接發出正確的線。我嘗試寫我自己的行標記,但似乎通過(良好)複製而不改變CPP的內部行跟蹤(不太好),所以它緊接着一個新的行標記糾正事情... –

+0

@RupertSwarbrickatBroadcom Huch?這聽起來像一個錯誤。在我的本地C編譯器中,在預處理器插入行標記後,行指令被保留。 – fuz

+0

@RupertSwarbrickatBroadcom你確定這發生了嗎?請記住,您需要插入*行指令,*而不是*行標記*,如我在答案中所看到的。 – fuz