如果c++的變長引數經過了多輪的呼叫,就可能失去作用
間接引址,但是只能引用到第乙個變長引數。
va_start(marker, format);
s_loggers[filename]->loglinef(format, va_arg(marker, va_list));
va_end(marker);
va_start(marker, format);
s_loggers[filename]->loglinef(format, marker));
va_end(marker);
但是,其實不管怎樣,只要讓最後一步的marker指向引數列表,就不會出錯。
marker是怎樣取到的?
char * *
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _crt_va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
char * va_list;
但是當多了一層函式呼叫後,format的位址發生了變化
char * *
因此va_start取到的marker就出現了錯誤。
怎麼解?
c 變長引數
c 在支援變長引數時,用到了三個巨集,va start va arg va end,和乙個資料型別va list。談談我對他們使用上理解吧 va list ptr 首先定義乙個該型別的指標 va start ptr,parm1 該型別指標和入參的第乙個引數關聯 type va arg ptr,tpy...
C 變長模板引數
自 c 11 語言核心的改進中,最為關注的有 rvalue reference 這裡有一篇拙作 lambda,variadic template。rvalue 規則稍微複雜,但一旦理解和記住了,應用上就沒有什麼困難。lambda 其實是乙個 很自然 的語言設施,除了語法稍顯詭異之外,習慣了就能馬上用...
C 可變長引數
前面說到可變長引數 最後重要的是 第乙個引數為後面的引數的形式,format.i.e.printf 在這篇中想說的是不安全的問題 其實就是我瞎搞 先上 include include include void subfunc char format,va end ap return void fun...