日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

可变参数__VA_ARGS__使用和va_list使用小结

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 可变参数__VA_ARGS__使用和va_list使用小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. #用來把參數轉換成字符串

#define P(A) printf("%s:%d\n",#A,A);

#define SQUARE(x) printf("The square of "#x" is %d.\n", ((x)*(x)));

?

2. ##運算符可以用于宏函數的替換部分。這個運算符把兩個語言符號組合成單個語言符號

?

3. __VA_ARGS__ 是一個可變參數的宏,很少人知道這個宏,這個可變參數的宏是新的C99規范中新增的,目前似乎只有gcc支持(VC6.0的編譯器不支持)。

實現思想就是宏定義中參數列表的最后一個參數為省略號(也就是三個點)。

?

4. ##__VA_ARGS__ 宏前面加上##的作用在于,當可變參數的個數為0時,這里的##起到把前面多余的","去掉的作用,否則會編譯出錯

?

舉例:

#define my_print1(...)? printf(__VA_ARGS__)

#define my_print2(fmt,...)? printf(fmt,__VA_ARGS__)??

#define my_print3(fmt,...)? printf(fmt,##__VA_ARGS__)??

?

5.?

C語言printf家族函數的成員:

#include?stdio.h

int printf(const char *format, ...); //輸出到標準輸出

int fprintf(FILE *stream, const char *format, ...); //輸出到文件

int sprintf(char *str, const char *format, ...); //輸出到字符串str中

int snprintf(char *str, size_t size, const char *format, ...);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//按size大小輸出到字符串str中

??

以下函數功能與上面的一一對應相同,只是在函數調用時,把上面的...對應的一個個變量用va_list調用所替代。在函數調用前ap要通過va_start()宏來動態獲取。

#include stdarg

int vprintf(const char *format, va_list ap);

int vfprintf(FILE *stream, const char *format, va_list ap);? ? ?

int vsprintf(char *str, const char *format, va_list ap);

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

?

?

// 函數add() 計算可選參數之和

// 參數:第一個強制參數指定了可選參數的數量,可選參數為double類型

double add( int n, ... )

{

int i = 0;

double sum = 0.0;

va_list argptr;

va_start( argptr, n ); // 初始化argptr

for ( i = 0; i < n; ++i )? ? ? ? // 對每個可選參數,讀取類型為double的參數,

sum += va_arg( argptr, double ); // 然后累加到sum中

va_end( argptr );

return sum;

}

?

//里有vsnprintf整合可變參數為字符串

void stdio_printf(const char* fmt, ...)

{

? ? uint16_t len, i;

? ? va_list ap;

? ? char buffer[256];

? ??

? ? va_start(ap, fmt);

? ? len = vsnprintf(buffer, sizeof(buffer), (const char*)fmt, ap);

? ? va_end(ap);

uart_send(buffer, len);

}

總結

以上是生活随笔為你收集整理的可变参数__VA_ARGS__使用和va_list使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。