作者tinlans ( )
看板C_and_CPP
標題Re: [語法] 請問 "unique_variable_name##__LINE__ …
時間Fri Jul 30 22:04:51 2010
※ 引述《HeyScng ( )》之銘言:
:
[DELETE]
: 其中有一個 macro 看不太懂 "unique_variable_name##__LINE__"
:
: #define SEQ_TRACE(txt) SequenceTracer unique_variable_name##__LINE__ (txt)
[DELETE]
:
: 網路上查了一下
: __LINE__ : 似乎是代表目前的所在行數
:
: ## : 似乎是"merging" operator
:
: 但 unique_variable_name 實在是找不到
[DELETE]
unique_variable_name 是什麼不重要,
重要的是這個 macro 期望在第 20 行寫 SEQ_TRACE("abc") 會被展開成:
SequenceTracer unique_variable_name20 ("abc")
## 就是把文字串接起來成為 code 的一部份用。
: → james732:我用g++編譯 那個 __LINE__ 沒有被替換成行號 真怪... 07/30 19:27
這是因為正確的做法是需要多一層間接層:
#define CONCAT_(x, y) x ## y
#define CONCAT(x, y) CONCAT_(x, y)
#define SEQ_TRACE(txt) \
SequenceTracer CONCAT(unique_variable_name, __LINE__)(txt)
最後一行 BBS 的寬度不夠所以我用 \ 斷行,跟問題無關。
重點是一個 macro 本身不含 # 和 ## 的時候才會觸發遞迴展開,
__LINE__ 需要第二次的遞迴展開才能變成行號,
所以需要一個間接層。
--
Ling-hua Tseng (uranus@tinlans.org)
Department of Computer Science, National Tsing-Hua University
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
http://www.tinlans.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.115.133
推 nowar100:原來要不含 # 或 ## 才會遞迴展開啊! 受教了 07/30 22:14
推 VictorTom:推~~受教了....<(_ _)> 07/30 22:22
推 Dannvix:受教了 <( _ _ )> 07/30 22:24
推 HeyScng:又學習到了 <( _ _ )> Thanks 07/30 22:54
→ yoco315:剛好日前要用到這個功能 = = 因為 SunPro 的 bug... 07/30 22:57
→ yoco315:結果這是一個語言的defect,gcc後來fix了,但是sunprocc沒有 07/30 22:59
→ yoco315:最後只好用很難看的marco避開這個問題 orz 07/30 22:59
→ yoco315:我需要一個static specialized function template.. 07/30 23:00
→ yoco315:但是specialized func temp 不能 static.. (fix之後可以) 07/30 23:01
→ yoco315:如果不加static 我不同檔案include這個.h 那就會有得到 07/30 23:02
→ yoco315:multiple referenced... 但是加了static 又編譯不過 07/30 23:02
→ yoco315:最後只好讓每個include這個.h的人都看到不同的函數名稱.. 07/30 23:03