看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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