格式化字串,可變引數函式需要借助於va_list va_start va_arg va_end巨集,可變引數巨集需要借助於##.
變參1:最後乙個可見引數型別是int
int add(int n, ...);
int main()
int add(int n, ...) /* 該函式返回 n 個 int 數的和,n個int,跟在第乙個引數後面,依次列出*/
va_end(arg); /* 結束之前,end 一下~~ */
return sum;
}
變參2:最後乙個可見引數型別是可變引數的格式化字串
void test(const char *s, ...)
int main()
執行結果:
used is 13
13name-1984-321
used is 8
888 to 99
巨集函式
#define log_printf(f,arg...) \
do;\
sprintf(logp,"func %s line %d"f,__func__,__line__,##arg);\
printf("logp %s",logp);\
}while(0)
void main()
while(0);
return;
}
1. 巨集函式的引數沒有型別
2. while(0)後需要「;」,所以巨集函式中do while不能有大括號包圍所有。
3. 也可用vprintf直接列印可變引數到終端
巨集函式呼叫可變參函式舉例
#define printf_s(s,arg...)\
dowhile(0)
void test(const char *s, ...)
int main()
C函式和巨集中的可變引數
一 呼叫慣例 函式的呼叫方和被呼叫方對函式如何呼叫應該有統一的理解,否則函式就無法正確呼叫。比如foo int n,int m 呼叫方如果認為壓棧順序是m,n,而foo認為壓棧順序是n,m,那麼這個函式就不會呼叫成功。因此,函式的呼叫方和被呼叫方對於函式如何呼叫需要有個明確的約定,雙方都遵守同樣的約...
C函式和巨集中的可變引數
一 呼叫慣例 函式的呼叫方和被呼叫方對函式如何呼叫應該有統一的理解,否則函式就無法正確呼叫。比如foo int n,int m 呼叫方如果認為壓棧順序是m,n,而foo認為壓棧順序是n,m,那麼這個函式就不會呼叫成功。因此,函式的呼叫方和被呼叫方對於函式如何呼叫需要有個明確的約定,雙方都遵守同樣的約...
可變引數函式
c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg ptr,type void va end va list arg ptr va list 用來儲存巨集va start va arg和v...