Re: [語法] 請問 "unique_variable_name##__LINE__ …

看板C_and_CPP (C/C++)作者 ( )時間15年前 (2010/07/30 22:04), 編輯推噓4(408)
留言12則, 5人參與, 最新討論串1/1
※ 引述《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

07/30 22:14, , 1F
原來要不含 # 或 ## 才會遞迴展開啊! 受教了
07/30 22:14, 1F

07/30 22:22, , 2F
推~~受教了....<(_ _)>
07/30 22:22, 2F

07/30 22:24, , 3F
受教了 <( _ _ )>
07/30 22:24, 3F

07/30 22:54, , 4F
又學習到了 <( _ _ )> Thanks
07/30 22:54, 4F

07/30 22:57, , 5F
剛好日前要用到這個功能 = = 因為 SunPro 的 bug...
07/30 22:57, 5F

07/30 22:59, , 6F
結果這是一個語言的defect,gcc後來fix了,但是sunprocc沒有
07/30 22:59, 6F

07/30 22:59, , 7F
最後只好用很難看的marco避開這個問題 orz
07/30 22:59, 7F

07/30 23:00, , 8F
我需要一個static specialized function template..
07/30 23:00, 8F

07/30 23:01, , 9F
但是specialized func temp 不能 static.. (fix之後可以)
07/30 23:01, 9F

07/30 23:02, , 10F
如果不加static 我不同檔案include這個.h 那就會有得到
07/30 23:02, 10F

07/30 23:02, , 11F
multiple referenced... 但是加了static 又編譯不過
07/30 23:02, 11F

07/30 23:03, , 12F
最後只好讓每個include這個.h的人都看到不同的函數名稱..
07/30 23:03, 12F
文章代碼(AID): #1CKjm79n (C_and_CPP)
文章代碼(AID): #1CKjm79n (C_and_CPP)