可变参数__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使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AIR720串口2收发数据问题
- 下一篇: FreeRTOS的中断优先级配置小结