Re: [問題] __LINE__這類型macro是怎麼實作的?

看板C_and_CPP作者 (眠月)時間15年前 (2010/08/04 00:03), 編輯推噓10(10038)
留言48則, 12人參與, 最新討論串2/2 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 我覺得這個好神 : 我不確定它是不是macro 至少我 F12 在VC是無法跳到定義.... : 但我完全不知他怎麼有辦法知道行數 編譯器內建支援的啦... 有些地方可以拿來做一些特別用途 主要是追蹤問題程式碼的出處,比方說 #define MY_ASSERT(x) \ if (!(x)) cerr << __FILE__ << ":" << __LINE__ << endl ; 或是用來追蹤記憶體的配置 void* _myAlloc(size_t n, const char* file, size_t line) { record (n, file, line) ; // 紀錄哪個檔案哪行要了多少到某個 log file return malloc(...) ; } 然後像這樣使用 #define MALLOC(x) _myAlloc(x, __FILE__, __LINE) int *p = MALLOC(...) ; 這樣你所有配置的記憶體就會配 log 下來, 配合對應的 FREE log,你可以一一對應,抓到 memory leak。 像這種編譯器/Prerpocessor內建的 macro 其實很多,這邊有個列表 http://predef.sourceforge.net/index.php -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.114.102

08/04 00:07, , 1F
其實原po是問怎麼實作的@@
08/04 00:07, 1F

08/04 00:16, , 2F
推y大的說明, 小弟以前在自家的code看過卻都不曉得怎麼
08/04 00:16, 2F

08/04 00:17, , 3F
用的, 但是多用在如y大例子說到的地方:)
08/04 00:17, 3F

08/04 00:26, , 4F
應該是編譯器的前置處理器幫你處理掉了, 而非程式碼
08/04 00:26, 4F

08/04 00:35, , 5F
Thx只是他到底怎麼有辦法算出行數和哪個file name...自己想做
08/04 00:35, 5F

08/04 00:35, , 6F
作不到吧?
08/04 00:35, 6F

08/04 00:58, , 7F
@@" 我不是已經回給你了嗎?
08/04 00:58, 7F

08/04 01:14, , 8F
執行 gcc -E 或 cpp 就能得到前處理器處理後的程式碼。
08/04 01:14, 8F

08/04 01:14, , 9F
前處理器就是文字處理器,算行號這種小學生作業等級的功能
08/04 01:14, 9F

08/04 01:15, , 10F
要實作會有什麼困難嗎?
08/04 01:15, 10F

08/04 01:15, , 11F
XD
08/04 01:15, 11F

08/04 01:16, , 12F
真的懶的話還能用 cat -n 再 pipe 給 awk 抓第一個 column
08/04 01:16, 12F

08/04 01:21, , 13F
XD t大Good Job....XD
08/04 01:21, 13F

08/04 01:22, , 14F
Compiler肯定能知道自己compile的source與行號呀XD
08/04 01:22, 14F

08/04 01:28, , 15F
compiler 倒是未必能準確知道行號,它 parse 完 code 以後
08/04 01:28, 15F

08/04 01:29, , 16F
這些資訊要特別存起來才行,不然 compiler 看到的只是一些
08/04 01:29, 16F

08/04 01:29, , 17F
我到大二才第一次用lex+yacc寫出小學生的作業...(泣
08/04 01:29, 17F

08/04 01:29, , 18F
tree 的結構。所以如果一個 function call 送引數拆成多行
08/04 01:29, 18F

08/04 01:29, , 19F
送,出錯的時候 compiler 只會顯示開頭那行或末行錯誤。
08/04 01:29, 19F

08/04 01:31, , 20F
行號計數用不到工具吧,while(getline(input, line)) ++i;
08/04 01:31, 20F

08/04 01:48, , 21F
編譯器都可以從原始碼生出.exe了,順手算一下行號不為過阿
08/04 01:48, 21F

08/04 01:48, , 22F
所以這也沒有什麼到底不到底的阿XD QQ29這很難想像嗎 @@?
08/04 01:48, 22F

08/04 01:50, , 23F
yoco大還沒回答我貴公司是在做什麼的耶 很好奇XD
08/04 01:50, 23F

08/04 05:02, , 24F
樓上別哭,我到大三才第一次用lex+yacc寫出小學生的作業...
08/04 05:02, 24F

08/04 05:47, , 25F
有沒有這麼誇張,算行號和把 __LINE__ 代換就用 lex/yacc
08/04 05:47, 25F

08/04 08:57, , 26F
XDD 用到lex/yacc真的太扯了 這把牛刀也太大了點XD
08/04 08:57, 26F

08/04 09:00, , 27F
然後...QQ29可能有點想偏了,一個程式(compiler)要知道
08/04 09:00, 27F

08/04 09:00, , 28F
自己在處理哪一個檔案和處理到檔案的哪裡會很難嗎
08/04 09:00, 28F

08/04 09:01, , 29F
如果真的無法想像,按照K&R去實作wc/cat/head就會了解了
08/04 09:01, 29F

08/04 09:12, , 30F
確實compile完後是剩下AST, 不過小弟就是只額外去記錄這
08/04 09:12, 30F

08/04 09:13, , 31F
些資訊啦XD 雖然有想過經過cpp後是否會導致行號改變, 不
08/04 09:13, 31F

08/04 09:13, , 32F
過感覺也不是不能克服的問題就是了:)
08/04 09:13, 32F

08/04 10:30, , 33F
經過 cpp 會打上 # 1 "file" 這種標示哪個檔哪一行的東西
08/04 10:30, 33F

08/04 10:31, , 34F
不然 #include 一個 header 就整個偏掉了,
08/04 10:31, 34F

08/04 10:31, , 35F
雖然不 #include 任何東西也會偏掉 XD
08/04 10:31, 35F

08/04 13:40, , 36F
原來不include也會偏掉....XD
08/04 13:40, 36F

08/04 15:44, , 37F
QQ29不是資工系的嗎,compiler跟系統程式應該是必修吧
08/04 15:44, 37F

08/04 16:45, , 38F
可能年級還沒到修那些課吧。
08/04 16:45, 38F

08/04 16:50, , 39F
樓樓上...0.0
08/04 16:50, 39F

08/04 16:52, , 40F
小弟我修完了那兩堂課也還是不知道這種東西(掩面Q_Q~)
08/04 16:52, 40F

08/04 16:53, , 41F
以前修的課, 有些都到了真正工作以後才有些感覺....Orz
08/04 16:53, 41F

08/04 21:54, , 42F
EDA tool @@
08/04 21:54, 42F

08/04 23:51, , 43F
沒修過阿 修過也都是混過
08/04 23:51, 43F

08/05 00:00, , 44F
前幾天問學弟才知道118大學部沒開系統程式...<囧>
08/05 00:00, 44F

08/05 02:26, , 45F
系統程式十年前就一堆大學資工系停開了。
08/05 02:26, 45F

08/05 21:35, , 46F
只好去找宅色夫進修 >///<
08/05 21:35, 46F

08/06 12:57, , 47F
我118的 老師說系統程式太雜太難教..不如分到各科一點一
08/06 12:57, 47F

08/06 12:57, , 48F
點教XD...
08/06 12:57, 48F
文章代碼(AID): #1CM3tjhC (C_and_CPP)
文章代碼(AID): #1CM3tjhC (C_and_CPP)