我需要幫助做以下幾點:如何通過C預處理器打印磅/散列?
預處理宏標籤(X)須輸出 「#X」,例如,
#define label(x) ...
如果我叫標籤(aname),輸出應爲「# aname「(沒有引號)
我知道,以下嘗試是錯誤的。
它可能存在一種轉義#(磅),但我不知道,如何逃生?
編輯:我跑「的gcc-E測試-o測試.html「來獲得輸出。重點是:只有使用預處理器的功能,如何用makro打印出散列標記(#)?
我需要幫助做以下幾點:如何通過C預處理器打印磅/散列?
預處理宏標籤(X)須輸出 「#X」,例如,
#define label(x) ...
如果我叫標籤(aname),輸出應爲「# aname「(沒有引號)
我知道,以下嘗試是錯誤的。
它可能存在一種轉義#(磅),但我不知道,如何逃生?
編輯:我跑「的gcc-E測試-o測試.html「來獲得輸出。重點是:只有使用預處理器的功能,如何用makro打印出散列標記(#)?
答案是:
#define hash #
#define f(x) x
#define label(a) f(hash)a
然後
label(foobar)
創建
#foobar
我在的幫助下找到了你們全部,但尤其是wintermute。 非常感謝!
(使用gcc 4.3.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看起來不錯,可能更適合。
我不認爲你可以這樣做,這不是完全不合理的,因爲C預處理器的輸出不應產生未加引號的'#',因爲這將表示預處理器指令,並且不能生成預處理器指令就像那樣。
換句話說,C預處理器是C(和C++)的預處理器,而不是一個完全通用的工具。
要麼使用替代宏處理器(m4
是類Unix系統上的標準建議),要麼以不同方式處理事情。
例如,有宏替換: '!@'
#define label(x) [email protected]!x
然後後期處理的輸出替換與'#'。 imake
程序使用類似的特技; C預處理器完成大部分工作,但其輸出不保留'make'所需的換行符,所以'imake'使用'@@ \'或'以指示在C預處理器完成其最差之後需要插入換行符的位置。)
你可以做這樣的事情:
#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"
請問你要做什麼? – 2009-09-06 20:12:30
* g *是。我將使用預處理器來「創建」html代碼;) 應使用label(x)創建指向錨點的鏈接,例如... 我減少了問題的複雜度。 – tuergeist 2009-09-06 20:14:16
您是否希望將此HTML代碼作爲字符串用於C程序或直接用於HTML代碼直接瀏覽器? – 2009-09-06 20:16:36