每次編程開始先輸入 #include,那麼計算機在讀取 # 符號的時候 正在做什麼?

希望能用通俗的精簡描述出,當計算機讀取到 pound 這個符號的時候,也就是 # 這個單獨的符號,那一刻,計算機正在處理什麼行為?


Clang3.6

Lexer.cpp Line 3532

PP是 Preprocessor實例,這部分對應實現在 Lex er/PPDirectives.cpp Line 474 只問到遇到#在哪裡 後面不展開了


「我看到了一個井號,要觸發什麼 preprocessor directive,待我看看接下來是什麼東西」


電腦在做ctrl+c和ctrl+v


你寫一個程序到運行,其實中間有這麼幾步:

1. build:把你的程序變成一個可執行文件

1a. preprocess:預編譯器負責處理所有預編譯指令(#include這些)

1b. compile:編譯器負責把每個源代碼文件編譯得到一個二進位文件

1c. link:鏈接器負責把一堆二進位文件以及庫連起來。

2. run:運行程序

當然1a/1b/1c的區分只是理論上的,有的編譯器可以把1a和1b一起做或者把1b和1c一起做。

所以#開頭的東西只有preprocess這個環節會被用到,預編譯器看到#,就會往後看,看看是不是include,define,ifdef,pragma等幾個預編譯指令中的一個,如果是的話,做相應的操作。

後面環節里這些預編譯指令都不再存在。


讀到#這個符號當然是詞法分析(lexer)了

後邊的步驟都不會讀源文件的


你說的是編譯過程,此時compiler 正在把源代碼一個字一個字的進行分析.

當讀到 井號 時,就預示著下面要進入某種預處理語法解析了..

僅此而已...


現在流行不看書只刷知乎了么?


這個問題其實涉及到了編譯原理的相關內容。

簡單地說,在編譯過程中,編譯器實際上是由一系列「狀態」構成的,每讀入一個字元,編譯器就從一個狀態跳轉到另一個狀態,這個模型被稱為狀態機

當編譯器讀入#符號的時候,編譯器就從原始狀態跳轉到預編譯接受狀態,再根據接下來讀入的字元進行具體的狀態執行。

值得注意的是,#include實際上在編譯過程中屬於預編譯,也就是說編譯器實際上是優先對#進行操作,進行頭文件引入和宏定義替換,在這之後才是程序的編譯過程。

以上。


畢業很多年,我都不知道編譯原理這門課到底有什麼卵用,謝謝題主你回答了我的問題。


準備讀 』i』


不是預編譯么


在題主提問的措辭中,沒看出來是看過《編譯原理》的


推薦閱讀:

C++ 和 Objective-C 都可以 100% 翻譯為 C 代碼嗎?
搞oi/acm的大神為什麼要#define N 1000+10?
運行時異常處理程序是如何實現的?
為什麼大多數程序主函數都return 0; 不return 1; ?
為什麼使用gcc編譯代碼後局部數組變數的初始值消失了?

TAG:編程語言 | 編程 | 彙編語言 | 計算機科學 | CC |