博客專欄

        EEPW首頁 > 博客 > 可變參數實現log打印

        可變參數實現log打印

        發布人:電子禪石 時間:2020-08-27 來源:工程師 發布文章

        實現步驟如下: 
            1. 函數原型中使用省略號; 
            2. 函數定義中創建一個va_list變量; 
             3. 初始化va_list變量; 
             4. 訪問參數列表; 
             5. 完成清理工作; 

          上述步驟的實現需要使用到四個宏:va_list、va_start(va_list, arg)、va_arg(va_list, type)、va_end(va_list)這些宏在頭文件stdarg.h中聲明定義。因此使用時需要包含該頭文件

        #include "stdafx.h"
        #include <stdarg.h>
        using namespace std;
         
        void trace_info(const char* file, const char* func, int line, const char* format, ...){
        	fprintf(stdout, "[%s:%d]%s: ", file, line, func);
        	va_list vaList;
        	va_start(vaList, format);
        	vfprintf(stdout, format, vaList);
        	va_end(vaList);
        	fprintf(stdout, "%c", '\n');
        }
        #define __TRACE_INFO__(...) trace_info(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__);
        int _tmain(int argc, _TCHAR* argv[])
        {
        	__TRACE_INFO__("error code is %d", 1);
        	__TRACE_INFO__("error code is %d", 2);
        	return 0;
        }

        使用這種方法需要注意一下幾點: 
          1. 函數原型中,省略號必須在參數列表的末尾:也就是說,在函數原型中參數列表省略號的右邊不能再出現確定參數; 
          2.運行時,函數必須能夠根據已有信息(既有約定,或確定實參)確定可變參數的具體個數與類型:函數定義需要知道可變參數的具體類型、個數,這些信息是在運行時確定的,那么顯然應該由實參來確定。
          3. 使用完成時需要用va_end()做清理工作,可變參數宏可能使用了動態分配的內存,忘記執行清理操作有可能導致內存泄漏等問題; 
          4.可變參數宏只能實現順序訪問可變參數,無法后退訪問,但是可以在清理操作完成后重新使用va_start初始化va_list變量,重新遍歷形參表; 
          5.該方法是極不安全的,宏本身無法提供任何安全性保證,他總是按照既定代碼“自作多情”的認為實參就應該是那么多,即使實參并不是那么多。這就要求所有安全性必須由程序員來保證。例如,在以上的示例代碼中,如果調用時指定count為10,但實際上只給出9個可變形參,那么函數還是會讀取10個參數,顯然第十次讀取是多余的,多余的操作一般不會有什么好結果,當然如果實參過多,多余的實參也不會被讀取而是被忽略。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        手機電池相關文章:手機電池修復


        晶體管相關文章:晶體管工作原理


        晶體管相關文章:晶體管原理
        雙控開關相關文章:雙控開關原理


        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 莱州市| 清远市| 微博| 南京市| 涟水县| 崇左市| 双鸭山市| 陇川县| 布尔津县| 杨浦区| 桐乡市| 新田县| 博兴县| 雅江县| 邢台市| 西峡县| 定南县| 德惠市| 尤溪县| 万盛区| 华容县| 宜黄县| 城市| 潼关县| 伊金霍洛旗| 武胜县| 公主岭市| 定结县| 桂平市| 洛隆县| 阜宁县| 海南省| 镇江市| 成都市| 福海县| 汤原县| 微山县| 西平县| 台山市| 黔西| 元朗区|