可變引數 VA ARGS 使用和va

2021-09-25 11:22:17 字數 1514 閱讀 4660

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, ... )

//裡有vsnprintf整合可變引數為字串

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

和可變引數巨集 VA ARGS

1.的用法 假如希望在字串中包含巨集引數,ansi c允許這樣作,在類函式巨集的替換部分,符號用作乙個預處理運算子,它可以把語言符號轉化程字串。例如,如果x是乙個巨集參量,那麼 x可以把引數名轉化成相應的字串。該過程稱為字串化 stringizing incldue define psqr x pr...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...