看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
king19880326:其實原po是問怎麼實作的@@ 08/04 00:07
VictorTom:推y大的說明, 小弟以前在自家的code看過卻都不曉得怎麼 08/04 00:16
VictorTom:用的, 但是多用在如y大例子說到的地方:) 08/04 00:17
WPC001:應該是編譯器的前置處理器幫你處理掉了, 而非程式碼 08/04 00:26
QQ29:Thx只是他到底怎麼有辦法算出行數和哪個file name...自己想做 08/04 00:35
QQ29:作不到吧? 08/04 00:35
softwind: @@" 我不是已經回給你了嗎? 08/04 00:58
tinlans:執行 gcc -E 或 cpp 就能得到前處理器處理後的程式碼。 08/04 01:14
tinlans:前處理器就是文字處理器,算行號這種小學生作業等級的功能 08/04 01:14
tinlans:要實作會有什麼困難嗎? 08/04 01:15
loveme00835:XD 08/04 01:15
tinlans:真的懶的話還能用 cat -n 再 pipe 給 awk 抓第一個 column 08/04 01:16
VictorTom:XD t大Good Job....XD 08/04 01:21
VictorTom:Compiler肯定能知道自己compile的source與行號呀XD 08/04 01:22
tinlans:compiler 倒是未必能準確知道行號,它 parse 完 code 以後 08/04 01:28
tinlans:這些資訊要特別存起來才行,不然 compiler 看到的只是一些 08/04 01:29
hilorrk:我到大二才第一次用lex+yacc寫出小學生的作業...(泣 08/04 01:29
tinlans:tree 的結構。所以如果一個 function call 送引數拆成多行 08/04 01:29
tinlans:送,出錯的時候 compiler 只會顯示開頭那行或末行錯誤。 08/04 01:29
tinlans:行號計數用不到工具吧,while(getline(input, line)) ++i; 08/04 01:31
yoco315:編譯器都可以從原始碼生出.exe了,順手算一下行號不為過阿 08/04 01:48
yoco315:所以這也沒有什麼到底不到底的阿XD QQ29這很難想像嗎 @@? 08/04 01:48
hilorrk:yoco大還沒回答我貴公司是在做什麼的耶 很好奇XD 08/04 01:50
peefly:樓上別哭,我到大三才第一次用lex+yacc寫出小學生的作業... 08/04 05:02
tinlans:有沒有這麼誇張,算行號和把 __LINE__ 代換就用 lex/yacc 08/04 05:47
ikari512:XDD 用到lex/yacc真的太扯了 這把牛刀也太大了點XD 08/04 08:57
ikari512:然後...QQ29可能有點想偏了,一個程式(compiler)要知道 08/04 09:00
ikari512:自己在處理哪一個檔案和處理到檔案的哪裡會很難嗎 08/04 09:00
ikari512:如果真的無法想像,按照K&R去實作wc/cat/head就會了解了 08/04 09:01
VictorTom:確實compile完後是剩下AST, 不過小弟就是只額外去記錄這 08/04 09:12
VictorTom:些資訊啦XD 雖然有想過經過cpp後是否會導致行號改變, 不 08/04 09:13
VictorTom:過感覺也不是不能克服的問題就是了:) 08/04 09:13
tinlans:經過 cpp 會打上 # 1 "file" 這種標示哪個檔哪一行的東西 08/04 10:30
tinlans:不然 #include 一個 header 就整個偏掉了, 08/04 10:31
tinlans:雖然不 #include 任何東西也會偏掉 XD 08/04 10:31
VictorTom:原來不include也會偏掉....XD 08/04 13:40
king19880326:QQ29不是資工系的嗎,compiler跟系統程式應該是必修吧 08/04 15:44
tinlans:可能年級還沒到修那些課吧。 08/04 16:45
loveme00835:樓樓上...0.0 08/04 16:50
VictorTom:小弟我修完了那兩堂課也還是不知道這種東西(掩面Q_Q~) 08/04 16:52
VictorTom:以前修的課, 有些都到了真正工作以後才有些感覺....Orz 08/04 16:53
yoco315:EDA tool @@ 08/04 21:54
QQ29:沒修過阿 修過也都是混過 08/04 23:51
akasan:前幾天問學弟才知道118大學部沒開系統程式...<囧> 08/05 00:00
tinlans:系統程式十年前就一堆大學資工系停開了。 08/05 02:26
yoco315:只好去找宅色夫進修 >///< 08/05 21:35
hilorrk:我118的 老師說系統程式太雜太難教..不如分到各科一點一 08/06 12:57
hilorrk:點教XD... 08/06 12:57