2009-09-06 168 views
8

我需要幫助做以下幾點:如何通過C預處理器打印磅/散列?

預處理宏標籤(X)須輸出 「#X」,例如,

#define label(x) ... 

如果我叫標籤(aname),輸出應爲「# aname「(沒有引號)

我知道,以下嘗試是錯誤的。

​​

它可能存在一種轉義#(磅),但我不知道,如何逃生?

編輯:我跑「的gcc-E測試-o測試.html「來獲得輸出。重點是:只有使用預處理器的功能,如何用makro打印出散列標記(#)?

+1

請問你要做什麼? – 2009-09-06 20:12:30

+0

* g *是。我將使用預處理器來「創建」html代碼;) 應使用label(x)創建指向錨點的鏈接,例如... 我減少了問題的複雜度。 – tuergeist 2009-09-06 20:14:16

+0

您是否希望將此HTML代碼作爲字符串用於C程序或直接用於HTML代碼直接瀏覽器? – 2009-09-06 20:16:36

回答

13

答案是:

#define hash # 
#define f(x) x 
#define label(a) f(hash)a 

然後

label(foobar) 

創建

#foobar 

我在的幫助下找到了你們全部,但尤其是wintermute。 非常感謝!

(使用gcc 4.3.3)

+0

但這不是你的問題的答案:你問了引用的表達式'「#foobar」' – Christoph 2009-09-06 21:17:35

+0

這是明確定義的,還是特定預處理器實現tuergeist正在使用的函數? – bdonlan 2009-09-06 21:17:51

+0

我只想說,不久的將來,您可能會發現自己回到這裏,並詢問有關如何讓C預處理器執行X或Y的另一個問題。我希望您能記住我所說的這是一場艱苦的戰鬥,並且你強烈認爲我的建議是爲這項工作找到一個新工具。 – 2009-09-06 21:21:15

1

嘗試:

#define label(x) "#"x 
+0

只有如果用作char *在c – tuergeist 2009-09-06 20:46:29

3

在C字符串文字將被連接在一起,所以你可以做

#define label(x) "#" #x 

我不認爲這是可能的,而不字符串連接(即不調用C編譯器爲你想要做的):

你可以做一些花哨的東西,額外的間接水平,我甚至有預處理器產生所需的輸出通過

#define hash # 
#define quote(x) #x 
#define in_between(c, d) quote(C## d) 
#define join(c, d) in_between(c, d) 
#define label(x) join(hash, x) 
label(foo) 

問題是,它也將產生一個錯誤消息作爲in_between()擴展到#foo,這不是有效的預處理器令牌。我沒有看到任何解決方法。

我的建議是爲工作選擇合適的工具:如果您覺得喜歡冒險或使用PHP或Perl等腳本語言,請切換到另一種宏語言,如m4甚至ML/I。 GPP看起來不錯,可能更適合。

+0

導致'「#」「字符串」'這不是'#string' 請問你如何測試你的答案? – tuergeist 2009-09-06 20:20:46

+0

在C語言中,編寫'char * c =「#」「string」;'與編寫'char * c =「#string」;'相同' - 語言連接彼此相鄰的字符串文字。因此,這不適用於預處理器,但可以使用C語言。 – 2009-09-06 20:32:05

+0

正如我寫的,我將使用預處理器的輸出,不會運行其他的c編譯器。 – tuergeist 2009-09-06 20:35:56

4

我不認爲你可以這樣做,這不是完全不合理的,因爲C預處理器的輸出不應產生未加引號的'#',因爲這將表示預處理器指令,並且不能生成預處理器指令就像那樣。

換句話說,C預處理器是C(和C++)的預處理器,而不是一個完全通用的工具。

要麼使用替代宏處理器(m4是類Unix系統上的標準建議),要麼以不同方式處理事情。

例如,有宏替換: '!@'

#define label(x) [email protected]!x 

然後後期處理的輸出替換與'#'。 imake程序使用類似的特技; C預處理器完成大部分工作,但其輸出不保留'make'所需的換行符,所以'imake'使用'@@ \'或'以指示在C預處理器完成其最差之後需要插入換行符的位置。)

+0

謝謝你的建議... – tuergeist 2009-09-06 21:00:25

+0

+1以外的想法 – nalply 2011-07-21 10:07:52

4

你可以做這樣的事情:

#define f(x) x 
#define label(a) f(#)a 

我直接運行它通過cpp(C預處理器),而不是通過gcc測試這一點。示例:

cpp test > test.html 

使用屬於gcc版本4.0.1的cpp。

我注意到的唯一的問題是,我得到一些額外的不必要的輸出,即前4行的文件如下:

# 1 "test" 
# 1 "<built-in>" 
# 1 "<command line>" 
# 1 "test" 
+0

2:16:錯誤:'#'後面沒有宏參數 – tuergeist 2009-09-06 21:07:41

+0

@ tuergeist - 我實際上測試它比你有點不同。看到我更新的帖子。 – 2009-09-06 21:11:09

+0

這些第一行都可以,可以忽略。 – tuergeist 2009-09-06 21:11:54