回覆列表
  • 1 # 使用者4736541986520

    首先必須說明一點, 不是語言自帶的,C 中沒有任何內建函式。你可以試一下不加 編譯會發生什麼(gcc 是會給出 implicit declaration 這樣的警告資訊的)。

    語言的規則。C 中函式呼叫就是如下形式:

    所以遇到這種情況就會認為是函式呼叫。

    比如如下的語句:

    在詞法分析階段會識別為 這幾個 token,解析為函式呼叫是在語法分析(parsing)階段完成的。當然可能會涉及一些稍複雜(特殊)的情況,比如:

    透過函式指標呼叫function-like 宏(預處理階段會進行宏展開) 運算子,這個是透過維護一張 keyword 的表來識別的(《Parsing Techniques》裡稱這種文法為 Finite Choice Grammar)

    2. 這一步是在連結階段完成的,比如有一個原始檔 使用了 ,編譯時會在符號表中留下一個佔位符,編譯完生成目的碼檔案 。靜態連結( 時指定 選項)的時候首先會找到 所在的靜態庫檔案(印象中是 ),然後發現 的佔位符,會將相應的部分複製到 中,最後生成一個(完全連結的)可執行檔案。如果是動態連結,情況會更復雜一點,連結是在執行時進行的,CS:APP 第 7 章就是專門講連結的,可以詳細地瞭解一下。

    3. 學完編譯原理就知道了

    建議:先大致瞭解一下把原始檔轉換成可執行檔案的流程以及對應的 gcc 選項,動手實踐一下看看這些過程都做了什麼。編譯原理這種相對底層(基礎)的知識不同於程式語言、框架,必須要踏踏實實地跟著好的教程完整地學習。你的這些問題其實書上都有,如果你真的非常感興趣,可以看 CS:APP 和龍書(以及《Parsing Techniques》)詳細地瞭解(最後你可能會發現需要讀的遠不止這些),這樣才能得到成體系的知識;如果你沒啥興趣,就是單純的好奇,那就 Google 一下簡要的介紹;如果你連這樣的耐心都沒有,那不如去學學流行的程式語言、框架直接去賺錢。

  • 中秋節和大豐收的關聯?
  • 農行網上轉賬了,但是不發簡訊通知,是為什麼?