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 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...