看板 C_and_CPP 關於我們 聯絡資訊
環境: windows 7 mingw 問題: 知道編譯前會有個前處理,會把標頭一一展開, 但沒有真的去看過,於是動手寫了一個簡單的程式驗證: #include <stdio.h> int main(int argc, char* args[]){ printf("Hello, world!"); return 0; } 然後執行如下指令: > gcc -E hello.c -o hello.i 內容顯示為: http://paste.ideaslabs.com/show/1sU5l73z8G 問題一: 這個檔案出現了一堆 # 開頭且沒見過的用法,不曉得加一個空格再補個數字是什麼意思 問題二: 為什麼和原來的 stdio.h 差別這麼大?展開標頭不是只是複製貼上的動作嗎? stdio.h 內容: http://paste.ideaslabs.com/show/s5kObfjsk -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.5.35
CaptainH:這是前處理的最後結果(也就是真正拿去compile的東西) 10/02 16:29
CaptainH:所有的marco都展開了 10/02 16:30
謝謝你,另外我想再問一個問題,我後來又下了這個指令: > gcc -S hello.i -o hello.s 為什麼四百多行的 hello.i 編譯成組語後變得不到 30 行呢? http://paste.ideaslabs.com/show/7drRYhsvoW ※ 編輯: tonytonyjan 來自: 140.113.5.35 (10/02 16:47)
purpose:那幾乎都是些宣告而已,所以你就該知道,宣告是沒意義的 10/02 16:49
purpose:CPU 執行程式根本不需要他們,有些語言甚至不需要原型宣告 10/02 16:50
kdjf:沒有用到的define/include全都被丟掉了啊 10/02 16:53
CaptainH:不是吧, 是因為還沒link起來 10/02 16:59
CaptainH:你的程式編出來就是這樣而已呀~ 10/02 17:00
kdjf:如果你想看更精采的,就接下去compile, link 看會出現什麼吧 10/02 17:00
CaptainH:你用 gcc hello.c -o h1 和 gcc hello.c -o h2 -static 10/02 17:01
CaptainH:h2的大小會是h1的近百倍.. 10/02 17:02
tonytonyjan:加上 -v 之後看到 gcc 預設下 ld -Bdynamic 10/02 17:13
saxontai:問題一:那些是Line Control,告訴編譯器該行底下的內容 10/02 17:36
saxontai:是源自哪個檔案的哪一行。編譯錯誤訊息告訴你的檔案跟行 10/02 17:37
saxontai:號也跟Line Control有關。詳細請 Google "Line Control" 10/02 17:37
saxontai:問題二:不是單純複製貼上,遇到macro還會再展開。 10/02 17:38
tonytonyjan:這篇真是學習了很多,謝謝前輩們指點! 10/02 17:51
cobrasgo:原po請看程式設計師的自我修養 10/02 21:04