C 變長引數

2022-07-24 17:54:13 字數 785 閱讀 7936

如果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...