可變引數函式和巨集函式

2021-06-14 16:08:24 字數 1037 閱讀 9661

格式化字串,可變引數函式需要借助於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...