推 obov:五樓閃尿11/06 05:20
→ obov:超☆快速蓋11/06 05:21
→ obov:超☆快速蓋蓋11/06 05:21
→ obov:超☆快速蓋蓋蓋11/06 05:21
推 xyz4594:冒險蓋11/06 05:21
→ obov:幹拎娘插三小 → obov:連閃尿都要插 11/06 05:22
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.181.25
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441702226.A.ED3.html
→ s25g5d4: 簽名檔居然隨機選到 obov, 太神啦 09/08 16:53
→ s25g5d4: 晚點再補詳細說明 現在沒空 09/08 17:00
推 Makiyo5566: 可以耶!!! 真的太神惹~~請受小妹一拜 09/08 17:27
GCC, The C Preprocessor, Macros, Stringification
When a macro parameter is used with a leading ‘#’, the preprocessor
replaces it with the literal text of the actual argument, converted to a
string constant. Unlike normal parameter replacement, the argument is not
macro-expanded first. This is called stringification.
只要 macro 參數含有前綴 #, preprocessor 就不會對此參數展開 macro
所以 #define GG(name) ENV_##name 含有 #, 故不會再展開 (與其他 macro 連動)
加了一個 proxy 就可以避掉這個問題
#define GG_proxy(name) GG(name) 在這裡由於 name 沒有 # 前綴
name 會先被展開,接著才展開 GG(name)
※ 編輯: s25g5d4 (59.127.251.59), 09/09/2015 13:47:36
推 LPH66: 你引錯段了, 你應該要引用 ## 這個字串連接的那一段 09/09 17:32
→ LPH66: 這一段講的是 #name 這種用法, 它會把傳進來的 name 內容 09/09 17:32
→ LPH66: 變成字串, 因此它不會進一步下去代換參數內容 09/09 17:33
→ LPH66: 這跟這邊用的 ## 連接不太一樣 09/09 17:33
對,我引錯段了
上面引的下一章 Concatenation 有提到
If either of the tokens next to an ‘##’ is a parameter name, it is
replaced by its actual argument before ‘##’ executes. As with
stringification, the actual argument is not macro-expanded first.
所以 ## 會跟 # 一樣,不做 macro 展開
※ 編輯: s25g5d4 (59.127.251.59), 09/09/2015 18:13:36