預編譯之 LINE 和 FILE

2021-07-10 10:11:26 字數 1168 閱讀 5242

在提示出錯資訊和進行錯誤處理方面,除了assert斷言外,c標準還定義了2個巨集:__line__和__file__。它們在許多執行出錯的場合下都很有用處。例如,可以把它們和assert聯用來更精確地定位導致assert失敗的出錯點。實際上,大多數assert實現都使用了__line__和__file__來完成它們的工作。下面舉個例子來說明這兩個巨集的用處:

先定義乙個開啟檔案的模組,包含標頭檔案filefcn.h和執行檔案filefcn.c

我們在編寫乙個測試函式測試一下:

因為涉及到多個檔案,我們用make工具的話,需要寫個makefile檔案

生成可執行bin檔案testmacs

執行後的結果為:

首先在filefcn.c的open_file函式中,line和file分別是__line__和__file__的佔位符,這兩個巨集是由呼叫函式傳入。在編譯之前預處理器把__line__分別換成13和21,把__file__換成源**檔案的名字testmacs.c。如果open_file函式呼叫成功,則它返回0,否則它向stderr列印出診斷資訊,指出它失敗並返回1的檔名和行號(呼叫它的函式裡的行號)。如果我們在open_file的定義中使用__line__和__file__,行號和檔名就用處不大了。

從執行的結果可以看到在testmacs.c的第21行執行失敗,因為目錄下沒有tab_baz這個檔案。__file__和__line__在跟蹤程式錯誤方面也很有用。

預編譯處理 error和 line

error用於生成乙個編譯錯誤訊息 用法 error message message不需要用雙引號包圍 error編譯指示字用於自定義程式設計師特有的編譯錯誤訊息。類似的,warning用於生成編譯警告。error是一種與編譯器指示字 error可用於提示編譯條件是否滿足 error this fi...

C 居然沒有 FILE 和 LINE

c 居然沒有 file 和 line 而且沒有有效的替代方法。這著實讓我吃驚。有人說stackframe可以獲得filename and line,不要信他們。stackframe裡面的檔名和 行號都只有在debug版本下才有。release版本下面,stackframe裡面是不會有file inf...

JS預編譯 函式預編譯和全域性預編譯

預編譯發生在函式執行前一步 建立ao物件 執行期上下文 找形參和變數宣告,將變數和形參名作為ao 屬性名,值為undefined 將實參值和形參統一 在函式體裡面找函式宣告,值賦予函式體 結果 預編譯過程 函式馬上要執行,但是還沒執行 首先建立ao物件,也就是函式它產生的儲存空間庫 ao,b und...