Parent note padhne se pehle, tumhare paas uske har word ki pakki samajh honi chahiye. Yeh page unhe zero se build karta hai — pehle plain words, phir picture, phir kyun yeh topic unhe zaroorat hai. Yahan kuch bhi yeh assume nahi karta ki tumne pehle C likha hai.
Parent note baar baar "named parameter" aur "the extra arguments" keh raha hai. Pura trick yeh hai ki kuch arguments ke liye cups (parameters) pehle se wait kar rahi hoti hain, aur kuch ke liye nahi. Woh image pakad ke rakho — neeche sab kuch us argument ke baare mein hai jo bina cup ke aata hai.
Figure dekho. Named parameter n (yeh hamara last hai) ko ek labelled cup milta hai. Teen extra values 10, 20, 30 counter par bina label ke land karti hain — woh unlabelled region hi woh poora problem hai jise <stdarg.h> toolkit solve karta hai.
Calling Conventions and the Stack mein aur padho — lekin is page ke liye tumhe sirf itna chahiye: arguments ek line mein rehte hain jise macros walk kar sakte hain.
Figure mein red cursor ek pointer hai. Yahi woh next symbol hai jise hume define karna hai.
Figure mein, har box alag width ka hai kyunki har type ka alag sizeof hota hai. Yahi reason hai ki va_arg tumse type ka naam maangta hai — type batata hai ki current box kitna wide hai.
Har arrow keh raha hai "tumhe left wala box chahiye before right wala box sense make kare." Saare roads Variadic Functions par khatam hote hain — parent topic. Related deeper reading: C Standard Library, Function Pointers in C, Format String Vulnerabilities.
woh actual value jo call site par pass ki jaati hai (paani), jabki parameter uske liye wait kar raha labelled cup hota hai.
va_start(ap, last) mein, last refer karta hai...
jo bhi tumne ... se pehle wale last named parameter ka naam rakha ho (e.g. int sum(int n, ...) mein n).
Code samples mein ap hota hai...
cursor variable jise tumne va_list ap; se declare kiya — "ap" sirf argument pointer ka abbreviation hai; naam tumhari choice hai.
Stack humein deta hai...
memory ki ek predictable line jo (kuch) arguments hold karti hai, jisse cursor unhe order mein step karke dekh sake.
Kya saare variadic arguments hamesha stack par hote hain?
Nahi — bahut se ABIs pehle kuch CPU registers mein pass karte hain; va_list register area plus stack ko abstract karta hai taaki tumhe parwah na ho.
Ek pointer hold karta hai...
ek memory address (ek house number), value itself nahi.
&x ka matlab hai...
address-of: x ka location.
*p ka matlab hai...
dereference: woh value padho jo address p hold karta hai par store hai.
sizeof(T) cursor ko batata hai...
current value kitne bytes wide hai — though real ABIs alignment padding bhi add karte hain jise macros ko skip karna hota hai.
Tum ap += sizeof(T) haath se kyun nahi karte?
alignment aur padding rules platform ke hisaab se alag hoti hain; naive increment padding mein land karta hai aur misread hota hai. Macros ko handle karne do.
va_arg mein ek type woh promise hai ki...
yeh box itne bytes ka hai aur iss tarah interpret hona chahiye.
Default argument promotionschar/short ko...
int mein badal deti hain, aur float ko double mein.
Isliye tum kabhi va_arg(ap, float) nahi likhte lekin likhte ho...
va_arg(ap, double).
va_start, va_arg, va_end, va_copymacros hain kyunki...
sirf macros type name ko argument ki tarah le sakte hain aur ap ko in-place modify kar sakte hain.
... (ellipsis) ka matlab hai...
zero ya zyada additional arguments of unknown type follow karte hain, un-type-checked.
va_listopaque hai, isliye tum sirf...
macros ke through touch kar sakte ho — iski size inspect mat karo ya = se copy mat karo (use va_copy).
va_copy(dst, src) exist karta hai kyunki...
ek va_list single-use aur = se non-copyable ho sakta hai; va_copy same spot par ek independent cursor deta hai taaki tum list do baar walk kar sako.