C 遍歷可變引數 va list

2021-09-03 09:55:20 字數 1452 閱讀 2751

前言

在c++中使用可變引數可沒c#中那麼方便,使用起來也很麻煩,想盡辦法搜了很多資料仍然無果,但是確有一些心得。

文章

1.  

2.  va_list、va_start、va_arg、va_end的原理與使用

正文

一.  遍歷可變引數

1.1  傳入的時候指定引數個數

void

arg_cnt(

intcnt, ...)

va_end(arg_ptr);

} 呼叫方法:「arg_cnt(4,1,2,3,4);」,第乙個引數為傳入引數個數。

1.2  傳入的時候指定特殊的字元以標示為結

intdemo( 

char

msg, ... )

va_end( argp );

return0;

}  呼叫方法:「demo("demo", "this", "is", "a", "demo!", "");」,最後乙個引數標示結束。

二.  **cstring的format方法

在學可變引數這節的時候一直很嚮往能達到這種效果,即不用多傳乙個引數來指定結束。我臆斷有兩種情況來實現:

a).  編譯器做了手腳

編譯之後有可能改變了函式多傳入了乙個引數的個數,有幾個引數編譯的時候是能夠知道的。

b).  使用"%"作為特殊符號

實踐中發現如果有%字元出現在format中的話是會報錯的,所有我推斷他統計了"%"出現的次數,然後解析"%"後面的引數,比如"%d"、"%s",通過統計"%"出現的次數就能夠解決引數個數的難度,也就不用我們傳入引數個數來實現遍歷了。

c).  類似實現**

intfindcharcount(cstring csstr,

char

c)return

icount;

}bool cppsqlite3helper::executenonquery(

char

*commandtext,

const

char

*params

...)

stmt.execdml();

}catch

(cppsqlite3exception e)

catch

(...)

va_end(ap);

return

bresult;}

**說明:

這段**是在使用sqlite時封裝的一段**,盡量保持了c#的命名比較習慣一點,這段**只是編譯通過了,這裡僅用於說明這個道理和用法,是不是和format很像 :)

i.  使用:executenonquery("update test set c1 = ? where id = ? ","abc","1")

結束

C 遍歷可變引數 va list

正文 一.遍歷可變引數 1.1 傳入的時候指定引數個數 void arg cnt intcnt,va end arg ptr 呼叫方法 arg cnt 4,1,2,3,4 第乙個引數為傳入引數個數。1.2 傳入的時候指定特殊的字元以標示為結 intdemo char msg,va end argp ...

va list 可變引數

什麼是變長引數?所謂含有變長引數的函式是指該函式可以接受可變數目的形參。例如我們都非常熟悉的 printf,scanf等等。2 變長引數如何實現?首先來看下面這樣乙個例子 include include include void demo char msg,else break para va ar...

va list可變引數傳遞

va list va start 是何意?一 寫乙個簡單的可變引數的c函式 下面我們來 如何寫乙個簡單的可變引數的c函式.寫可變引數的 c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg ...