C语言自定义打印宏函数
在調試大型項目中,打印信息分級和指出打印所在處,更方便于解決問題。查閱網上的文章并加上自己的修改,實現了個簡單的宏打印函數來達到目的。宏函數實現在頭文件中,加上了打印級別來控制打印是否輸出,打印級別的設定需在調用的.c文件中自定義(這樣做是為了能實現不同文件的打印級別能不一樣,在調試指定文件或模塊的問題是,能起到屏蔽其他無關代碼打印的作用)。
typedef.h源碼:?
#ifndef _TYPEDEF_H_ #define _TYPEDEF_H_ #include < stdarg.h>#define INFO_OUTPUT ? ? ?3 #define WARNING_OUTPUT ? 2 #define DEBUG_OUTPUT ? ? 1 #define ERROR_OUTPUT ? ? 0//#define DEBUG_LEVEL ? ? ?DEBUG_OUTPUT //需在使用以下打印宏的.c文件中定義“DEBUG_LEVEL”變量 #define INFO_PRINT(info,...) ?\ do{ \if(DEBUG_LEVEL>=INFO_OUTPUT){\printf("Info %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\ }while(0)#define WARNING_PRINT(info,...) ?\ do{ \if(DEBUG_LEVEL>=WARNING_OUTPUT){\printf("Warning %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\ }while(0)#define DEBUG_PRINT(info,...) ?\ do{ \if(DEBUG_LEVEL>=DEBUG_OUTPUT){\printf("Debug %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\ }while(0)#define ERROR_PRINT(info,...) ?\ do{ \if(DEBUG_LEVEL>=ERROR_OUTPUT){\printf("Error %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\ }while(0)#endif?
測試代碼main.c:
#include<stdio.h> #include<Windows.h> #include "typedef.h"static int DEBUG_LEVEL = DEBUG_OUTPUT;void main(int argc,char **argv) {INFO_PRINT("hello %s\n", "world!");WARNING_PRINT("hello %s\n", "world!");DEBUG_PRINT("hello %s\n","world!");ERROR_PRINT("hello %s\n", "world!");while (1){Sleep(1000);} }打印結果:
?
注:在宏定義函數printf中info用雙引號括起來,是因為由于按照使用printf函數的習慣,在使用的時候的,info傳入是帶雙引號括起來的格式化字符串,如:DEBUG_PRINTT("input %d,%s\n",123,"abd");替換到宏里面的printf則為printf("Debug %s,%s,%d:""input %d,%s\n""",__FILE__,__FUNCTION__,__LINE__,123,"abd");這里利用了printf(“number1 ”? "number2 "? ?"number3"); 等價于printf("number1 number2 number3");的原理(如下圖)保證打印輸出達到想要的效果。按照這個原理可把DEBUG_PRINTT("input %d,%s\n",123,"abd");替換到宏里面并拆解成以下語句便能理解:printf("Debug %s,%s,%d:"? ?"input %d,%s\n"? ? "",__FILE__,__FUNCTION__,__LINE__,123,"abd");
生活不易,如果你覺得該文章對你有幫助,請幫忙點個贊👍,如有指教和討論,請在評論區留言一起探討。感謝觀看!
總結
以上是生活随笔為你收集整理的C语言自定义打印宏函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言多线程教程
- 下一篇: secure boot 是什么