目錄
- 一.##__VA_ARGS__簡介
- 二.##__VA_ARGS__經典案例
- 三.猜你喜歡
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.##__**VA_ARGS__**簡介
[__VA_ARGS__](https://www.codersrc.com/archives/9450.html) 在前面的文章也介紹了,有兩個缺點:
1.僅僅只支持字串常量,不支持可變引數
#define LOGFUNC(...) (printf(__VA_ARGS__))
2.僅僅只支持可變引數,不支持字串常量
#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
對于__VA_ARGS__ 的缺點,使用 ##__VA_ARGS__ 直接完美解決!##__VA_ARGS__ 使用如下:
#define edebug(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
二.##__VA_ARGS__經典案例
有時,我們想把除錯資訊輸出到螢屏上,而有時則又想把它輸出到一個檔案中,可參考下面的例子:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 函式不定長引數 ##__VA_ARGS__經典案例
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
//debug.c
#include <stdio.h>
#include <string.h>
//開啟下面的宏表示程式運行在除錯版本, 否則為發行版本, 這里假設只有除錯版本才輸出除錯資訊
#define _DEBUG
#ifdef _DEBUG
//開啟下面的宏就把除錯資訊輸出到檔案,注釋即輸出到終端
#define DEBUG_TO_FILE
#ifdef DEBUG_TO_FILE
//除錯資訊輸出到以下檔案
#define DEBUG_FILE "/tmp/debugmsg"
//除錯資訊的緩沖長度
#define DEBUG_BUFFER_MAX 4096
//將除錯資訊輸出到檔案中
#define printDebugMsg(moduleName, format, ...) {\
char buffer[DEBUG_BUFFER_MAX+1]={0};\
snprintf( buffer, DEBUG_BUFFER_MAX \
, "[%s] "format" File:%s, Line:%d\n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );\
FILE* fd = fopen(DEBUG_FILE, "a");\
if ( fd != NULL ) {\
fwrite( buffer, strlen(buffer), 1, fd );\
fflush( fd );\
fclose( fd );\
}\
}
#else
//將除錯資訊輸出到終端
#define printDebugMsg(moduleName, format, ...) \
printf( "[%s] "format" File:%s, Line:%d\n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );
#endif //end for #ifdef DEBUG_TO_FILE
#else
//發行版本,什么也不做
#define printDebugMsg(moduleName, format, ...)
#endif //end for #ifdef _DEBUG
int main(int argc, char** argv)
{
int data = https://www.cnblogs.com/shuopython/p/999;
printDebugMsg("TestProgram", "data = https://www.cnblogs.com/shuopython/p/%d", data );
return 0;
}
以上代碼可以實作以下功能:
- 通過使用 ##__VA_ARGS__ 可以輸出不定長引數,功能和 printf 函式一樣;
- 通過 DEBUG_TO_FILE 宏控制選擇將日志輸出到控制臺或者輸出到檔案中;
- 通過 _DEBUG 宏決定是否輸出日志,如果是開發用于除錯,可以定義這個宏,方便查看日志,如果是給用戶使用,那么可以不定義這個宏;
三.猜你喜歡
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 指標陣列和陣列指標區別
- C 語言 野指標
- C 語言 函式值傳遞和址傳遞
- C 語言 函式不定長引數
- C 語言 函式指標
- C 語言 指標函式
- C 語言 回呼函式 callback
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區別
- C 語言 const 修飾函式引數
- C 語言 const 和 define 區別
- C 語言 #運算子
- C 語言 ##運算子
- C 語言 __VA_ARGS__
- C 語言 ##__VA_ARGS__
- C 語言 函式不定長引數 ##__VA_ARGS__經典案例
未經允許不得轉載:猿說編程 ? C 語言 函式不定長引數 ##__VA_ARGS__經典案例
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300636.html
標籤:C
