程式編譯與鏈結,以及預定義符號,

2021-07-25 03:42:43 字數 1680 閱讀 3405

1.預處理識別符號又稱預定義符號,它們的值是(字串常量、十進位制數字常量)

(1)__file__   :表示進行編譯的源檔名

(2)__line__  :表示檔案當前行的行號

(3)__date__ :表示檔案被編譯的日期

(4)__time__  :表示檔案被編譯的時間

(5)__stdc__:表示若編譯器遵循ansi c,其值為1,否則未定義

用處:__line__和__file__用於在確認除錯輸出**方面,__date__和__time__用於在被編譯的程式中加入版本資訊,__stdc__用於在ansi和非ansi環境都必須進行編

譯的程式中結合條件編譯:

2.#:預處理器把 #巨集引數(#argument)這種結構翻譯為"argument" 

3.##: 對於這種兩個#的結構,預處理器把它兩邊的符號連線成乙個符號

4.關於巨集和函式的區別。

總的來說,巨集和函式的目的都是集中地實現某個特定的功能,但是二者有一些區別:

(1) 函式:函式**只出現於乙個固定的地方,程式每次使用這個函式時,都呼叫那個地方的同乙份**;所以函式存在呼叫、返回的額外開銷;但是函式引數只在函式呼叫

時求值一次,它的結果值傳遞給函式,表示式的求值結果更加容易**,並且引數的***不會造成任何特殊問題;此外,函式的引數是與型別有關的,若引數型別不同就需要

使用不同的函式,即使它們的任務相同

(2) 巨集:程式每次使用巨集時,巨集**都被插入到程式內部,除了非常小的巨集之外,程式長度大幅度增長;無需呼叫返回相比函式巨集速度更快;巨集引數求值是在所以周圍表示式

的上下文環境,如果不加圓括號,鄰近操作符的優先順序會產生不可預期的結果;引數每次用於巨集定義時,都會重新求值,則具有***的引數會產生不好的後果;另外,巨集與類

型無關,只要參賽的操作合法,它可以使用任何引數型別

總的來說,**比較長的程式,可以用函式實現的就不用巨集來實現

5.關於編譯鏈結的整個過程和詳細的每個過程

總體來說,乙個c程式從產生到實現要經過以下過程:

(1)編譯:又分為編譯 和 彙編兩個過程

<1>編譯:.c源程式---組合語言的過程

<2>彙編:組合語言到.obj目標檔案(二進位制檔案)的過程

這裡的目標檔案已經是二進位制檔案了,在編譯過程中,如果編譯器發現.c的源**有錯誤就會報錯,這時程式設計師重新檢查.c源程式;若.c原始檔通過編譯,就會生成.obj目標

檔案(根據平台不同,.obj副檔名不同,windows下是.obj檔案;linux下是.o檔案),無論如何通過編譯後的目標檔案是二進位制檔案

預定義符號與巨集

預處理器在原始碼編譯之前進行的一些文字性質的操作,它的主要任務包括刪除注釋,插入被 include指令包含的檔案內容,定義和替換由 define指令定義的符號以及確定 的部分內容是否應該根據一些條件編譯指令進行編譯。date 字串常量型別,表示當前所在原始檔的編譯日期,輸出格式為mmm dd yyy...

C語言編譯器的預定義符號

c語言編譯器的預定義符號 line 當前 源 檔案 行號 整數 file 當前正在編譯的檔案的檔名 字串 date 當前日期,以 月月 日日 年年年年 的形式給出 字串 time 當前時間,以 hh mm ss 的格式給出 字串 stdc 如果編譯器符合ansi c標準,該巨集為1,否則為0 std...

Python 程式編譯與鏈結

1 預處理 預編譯過程主要處理那些原始檔中的以 開始的預編譯指令,主要處理規則有 將所有的 define 刪除,並展開所用的巨集定義 處理所有條件預編譯指令,比如 if ifdef elif endif 處理 include 預編譯指令,將被包含的檔案插入到該編譯指令的位置,注 此過程是遞迴進行的 ...