一些簡單方便易用的C除錯用巨集

2021-08-20 20:38:20 字數 2617 閱讀 3309

最近在寫乙個 os 相關的小專案,引入了乙個很好用的標頭檔案debug.h,裡面定義了很多方便執行除錯的巨集,記錄和分享一下。注意博主是在linux環境下程式設計使用到的,至於在mingwvs等環境下能否使用,博主沒有嘗試過,歡迎討論。

首先定義除錯巨集以開啟除錯巨集:

#define debug
然後在**中需要用到的地方呼叫這個除錯標頭檔案裡面定義的巨集就可以了。

我們先列出功能,後面再討論如何實現的,最後給出源**。

本功能需要在程式中預先開啟乙個全域性檔案指標:

file *log_fp;
並在程式邏輯中先把檔案開啟好,開啟日誌檔案的操作建議放到程式中初始化階段或main函式最開始的位置。開啟以後,每次只需要呼叫log_write巨集即可方便地列印日誌檔案了,這個巨集方便之處在於可以傳入格式化字串帶引數,呼叫方法:

int var = function();

log_write("a line to log at %d.", var);

log巨集為我們提供了乙個方便的手段,用於插入到程式任意地方顯示需要列印的訊息,並在往螢幕輸出時可以一併輸出生效的log巨集所在的檔案、行數和函式名,以及要輸出的訊息的格式化字串和引數。下面是乙個使用例子:

char *line_read = readline(prompt);

#ifdef debug

log("line read: [%s]", line_read);

#endif

巨集assert用於傳入乙個驗證條件進行斷言驗證,如果失敗,會中止程式執行,並輸出一句提示資訊,該提示資訊作為引數傳入即可,使用方法如下:

int i = 11;

assert(i <= 10, "i is larger than 10.");

像上面的示例**,如果執行的話會程式會在此中止,並輸出

i is larger than 10.
告訴我們這個條件不成立,多用於除錯不完善功能時,希望在出錯時提前中止程式執行。

巨集panic的實質是對上述巨集assert的乙個封裝,讓其對0這個條件做斷言,由於這個條件是永假的,因此該巨集用於強制中止程式執行。例如:

int func()

假如有什麼很意外的情況訪問到了這裡,可能說明程式實現有問題,此時可以很優雅地處理這種預期外的情況。

巨集todo()也是對巨集panic的乙個封裝,用於無條件中止程式執行,並輸出一句話:

please implement me
// 該功能模組尚未實現

int func()

上述實現中用到了幾個ansi c標準中的幾個預定義巨集,他們有:

__line__:在源**中插入當前源**行號;

__file__:在原始檔中插入當前源檔名;

__date__:在原始檔中插入當前的編譯日期

__time__:在原始檔中插入當前編譯時間;

__stdc__:當要求程式嚴格遵循ansi c標準時該標識被賦值為1;

__cplusplus:當編寫c++程式時該識別符號被定義。

注意這些下劃線都是雙下劃線,即輸入兩個下劃線_。他們在編譯時的預處理階段,會被替換為相應功能描述中的值,因此完成編譯後就有了實際的值可以顯示出來。

將下列**存為debug.h,然後在需要使用的程式的**檔案中引用:

#include "debug.h"
即可使用上述的便捷功能了。

#ifndef __debug_h__

#define __debug_h__

#include

#include

#ifdef debug

extern file* log_fp;

# define log_write(format, ...) \

do \

} while (0)

#else

# define log_write(format, ...)

#endif

#define log(format, ...) \

do while (0)

#define assert(cond, ...) \

do \

} while (0)

#define panic(format, ...) \

assert(0, format, ## __va_args__)

#define todo() panic("please implement me")

#endif

C 巨集的一些筆記

define n2 2 僅僅是字串替換 define n 2 2 也是字串,但是是 2 2 define area x x x 帶參的巨集定義參會當作字串直接替換 三種特殊的符號 define tochar x x 就是加上單引號,越界會報錯 pragma可以說是c 中最複雜的預處理指令了,下面是最...

C巨集 define的一些用法

c語言中的 define命令,在編譯預處理時進行簡單的字元替換。其使用的一般形式為 define 識別符號 字串 其中的 表示這是一條預處理指令。凡是以 開頭的均為預處理命令。define 為巨集定義命令。識別符號 為所定義的巨集名。字串 可以是常數 表示式 格式串等。1.最常見的一種用法也是最簡單...

C中幾個特定巨集的介紹 一些除錯的小技巧

在c的除錯中,有幾個巨集經常被使用來輔助程式設計師進行程式除錯,這裡對之進行簡單介紹。1 function 該巨集被用來表示呼叫該巨集的函式。2 line 該巨集用來表示呼叫該巨集的對應行數。3 time 該巨集用來表示呼叫該巨集時的時間。4 date 該巨集用來表示呼叫該巨集的日期。5 file ...