可變參數巨集(DEBUG)

来源:http://www.cnblogs.com/yujone/archive/2016/02/27/5222843.html
-Advertisement-
Play Games

之前一直是到處寫printf來列印調試信息,不需要是還得一個一個註釋掉.之後上網查詢發現有很多方法來進行DEBUG列印,參數可變而且方便一次性開關. #define DEBUG(fmt,...) printf (fmt,lxx_va_args) 這裡的“…”指的是可變參數. int main() {...


之前一直是到處寫printf來列印調試信息,不需要是還得一個一個註釋掉.之後上網查詢發現有很多方法來進行DEBUG列印,參數可變而且方便一次性開關.

#define DEBUG(fmt,...)    printf (fmt,__VA_ARGS__)        這裡的“…”指的是可變參數.

int main() { DEBUG(“hello %d”,10); return 0; }

有時候,有個模塊有輸出信息,錯誤信息等.如果想單獨打開某一部分,可以如此設計:

  1: #define DRV_DEBUG       1
  2: #define DRV_DEBUG_IN    0x0001
  3: #define DRV_DEBUG_OUT   0x0002
  4: #define DRV_DEBUG_ERR   0x0004
  5: #define DRV_DEBUG_ALL   0xFFFF
  6: #if DRV_DEBUG
  7:      unsigned int drv_flags = DRV_DEBUG_ERR | DRV_DEBUG_OUT;
  8:      #define DRV_PRINT(flag, fmt, …)        \
  9:        do{                                  \
 10:            if (drv_flags & flag){           \
 11:                 printf(fmt, __VA_ARGS__);}  \
 12:            }while(0)
 13: #else
 14: #define DRV_PRINT(fmt,…)
 15: #endif
 

這樣,我只要列印OUT和ERR:

  1: void drv_write(char * msg_out)
  2: {
  3: 	DRV_PRINT(DRV_DEBUG_OUT,"%s", msg_out);		//輸出
  4: 	DRV_PRINT(DRV_DEBUG_ERR,"%s", msg_out);		//輸出
  5: 	DRV_PRINT(DRV_DEBUG_IN,"%s", msg_out);		//不輸出
  6: }
進一步,可以設計針對整個系統不同模塊的LOG輸出控制!TCP/IP協議棧實現Lwip就是這麼乾的.
但是發現光有printf還不夠,雖然調試信息是出來了,但是在這麼多的調試信息中並不能一下子知道這信息是從哪裡列印出來的.所以查到用另一種方法可以將文件名和源碼位置都列印出來.
在ANSI C中有這樣幾個巨集
__LINE__:插入當前行號
__FILE__:插入當前原文件名
__DATE__:插入當前編譯日期
__TIME__:插入當前編譯時間
所以巨集就變成這樣子了DEBUG(fmt,…)    printf(“FILE:”__FILE__”“,LINE:%d:”fmt”\n”,__LINE__,##__VA_ARGS__)
這裡特別註意下##__VA_ARGS__這裡的##是很有必要的,因為他的意思是如果沒有參數則讓預處理器忽略前面一個逗號.上面第一段的寫法不加參數是出錯的.所以第一段寫法必須帶參數.
DRV_PRINT(DRV_DEBUG_OUT,“hello world”);		//有問題,需要更改巨集定義,在前加上##

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事主的問題應該是想把最新的數據和次新數據放在一行里顯示。 因為沒有說明重覆的情況如何處理,即有多個最新數據或者有多個次新數據,所以我沒有做過多的處理。 哈哈哈。
  • 簡介 什麼是死鎖? 我認為,死鎖是由於兩個對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導致兩對象無法完成操作,且所持資源無法釋放。 什麼又是阻塞? 阻塞是由於資源不足引起的排隊等待現象。比如同時兩個進程去更新一個表。 這裡我們可以把阻塞作為死鎖的必要條件。下麵我們
  • 教程:http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html Mysql修改設置root密碼的命令及方法:http://jingyan.baidu.com/article/a3f121e41b141afc9052bb8e.html
  • 資料庫是定義及產品分類
  • SQL
    一.Transact-SQL的GO,詳解 (1) SQL Server 實用工具將 GO 解釋為應將當前的 Transact-SQL 批處理語句發送給 SQL Server 的信號。當前批處理語句是自上一 GO 命令後輸入的所有語句,若是第一條 GO 命令,則是從特殊會話或腳本的開始 處到這條 GO
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 在這一系列的上一篇,我們查看了維護計劃,一個維護計劃可能會創建多個作業,多個計劃。你還簡單地看了SSIS子系統,並查看了維護計劃作業步驟的 屬
  • 最近項目中要遞歸樹形,案例如下: 測試數據: CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10)) INSERT tb SELECT'001',NULL ,'山東省' UNION ALL SELECT'002','001','煙臺市' U
  • 為數據表去掉一個外鍵關聯,然後再添加一個外鍵關聯.批量數據導入.在全部用戶表和存儲過程中尋找包含某段文字的用戶表和存儲過程.數據表的列重命名.
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...