[問題] Source file after preprocessing

看板C_and_CPP作者 (南洋大兜蟲)時間11年前 (2012/10/02 16:16), 編輯推噓3(3015)
留言18則, 6人參與, 最新討論串1/1
環境: 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

10/02 16:29, , 1F
這是前處理的最後結果(也就是真正拿去compile的東西)
10/02 16:29, 1F

10/02 16:30, , 2F
所有的marco都展開了
10/02 16:30, 2F
謝謝你,另外我想再問一個問題,我後來又下了這個指令: > 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)

10/02 16:49, , 3F
那幾乎都是些宣告而已,所以你就該知道,宣告是沒意義的
10/02 16:49, 3F

10/02 16:50, , 4F
CPU 執行程式根本不需要他們,有些語言甚至不需要原型宣告
10/02 16:50, 4F

10/02 16:53, , 5F
沒有用到的define/include全都被丟掉了啊
10/02 16:53, 5F

10/02 16:59, , 6F
不是吧, 是因為還沒link起來
10/02 16:59, 6F

10/02 17:00, , 7F
你的程式編出來就是這樣而已呀~
10/02 17:00, 7F

10/02 17:00, , 8F
如果你想看更精采的,就接下去compile, link 看會出現什麼吧
10/02 17:00, 8F

10/02 17:01, , 9F
你用 gcc hello.c -o h1 和 gcc hello.c -o h2 -static
10/02 17:01, 9F

10/02 17:02, , 10F
h2的大小會是h1的近百倍..
10/02 17:02, 10F

10/02 17:13, , 11F
加上 -v 之後看到 gcc 預設下 ld -Bdynamic
10/02 17:13, 11F

10/02 17:36, , 12F
問題一:那些是Line Control,告訴編譯器該行底下的內容
10/02 17:36, 12F

10/02 17:37, , 13F
是源自哪個檔案的哪一行。編譯錯誤訊息告訴你的檔案跟行
10/02 17:37, 13F

10/02 17:37, , 14F
號也跟Line Control有關。詳細請 Google "Line Control"
10/02 17:37, 14F

10/02 17:38, , 15F
問題二:不是單純複製貼上,遇到macro還會再展開。
10/02 17:38, 15F

10/02 17:43, , 16F

10/02 17:51, , 17F
這篇真是學習了很多,謝謝前輩們指點!
10/02 17:51, 17F

10/02 21:04, , 18F
原po請看程式設計師的自我修養
10/02 21:04, 18F
文章代碼(AID): #1GQgBm-M (C_and_CPP)