Re: [問題] 關於macro在程式碼中的位置

看板C_and_CPP作者 (-858993460)時間15年前 (2010/09/11 07:29), 編輯推噓5(502)
留言7則, 4人參與, 最新討論串2/3 (看更多)
還是回一篇好了 你把兩個時間點混在一起了: 在我們叫起 compiler 幫我們編譯 source 時 首先會有一個 macro 置換的階段 (正式名稱叫「前處理階段」, preprocessing) 在這裡會處理所有的 # 開頭的 preprocessor directives 以及尋找其他地方有沒有因為 #define 而必須做字串代換的地方 這些全部處理完之後才進入編譯階段 才開始真正把程式編譯成執行檔 你的 PrintSum 當 #define DO_IT 在前面時 前處理階段中先看到了 #define 然後看到 #ifdef 發現有定義 所以把中間那一段加到實際編譯的程式當中 當前面沒有 #define DO_IT 時 (不管它在後面的哪裡) 前處理階段中看到 #ifdef 時發現沒有定義 所以就把中間那一段給丟掉 這也就是後面推文

09/11 15:23,
編譯器看到的程式碼不一樣
09/11 15:23
這句話的意思 也就是說 並不是到那裡時才去判斷有沒有定義 而是在送進編譯器之前時就決定有沒有它了 -- 而你的用詞「『跑』到那裡」 這讓我覺得你又把編譯階段和執行階段兩個時間點又混在一起了 等於是你把三個在不同時間點做的事混在一起講 所以很難簡單的向你說你的問題在哪裡... -- 'You've sort of made up for it tonight,' said Harry. 'Getting the sword. Finishing the Horcrux. Saving my life.' 'That makes me sound a lot cooler then I was,' Ron mumbled. 'Stuff like that always sounds cooler then it really was,' said Harry. 'I've been trying to tell you that for years.' -- Harry Potter and the Deathly Hollows, P.308 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92

09/11 16:19, , 1F
推L大說明, 不然請他把code 用cpp跑完看展開的結果吧XD
09/11 16:19, 1F

09/11 16:41, , 2F
樓上是說 gcc -E嗎...
09/11 16:41, 2F

09/11 16:42, , 3F
不記得了, 而且各家compiler參數還是執行檔不是都不一樣
09/11 16:42, 3F

09/11 16:42, , 4F
嗎@_@" 所以現在只記得functionality....XD
09/11 16:42, 4F

09/11 17:02, , 5F
哈..看完LPH大的詳細說明..我了解啦..感謝你還回覆一篇
09/11 17:02, 5F

09/13 21:16, , 6F
大推 gcc -E 有些國考計概題目先用這個處理過..就很好理解
09/13 21:16, 6F

09/13 21:16, , 7F
再寫個程式去 pass main以後的...就更棒了XD
09/13 21:16, 7F
文章代碼(AID): #1CYo_ndS (C_and_CPP)
文章代碼(AID): #1CYo_ndS (C_and_CPP)