Visual walkthrough — Macros vs inline functions
5.1.28 · D2· Coding › C Programming › Macros vs inline functions
Step 1 — Macro literally kya hota hai: ek find-and-replace robot
KYA. Tumhara program machine code mein convert hone se pehle, ek chota robot jise preprocessor kehte hain, tumhara source plain text ki tarah padhta hai — jaise kaagaz par likhe words, math ki tarah nahin. Jab yeh #define dekhta hai, toh ek rule yaad kar leta hai: "jahan bhi aage yeh word dikhe, usse kaat ke woh text wahan chipka do."
YEH tool kyun, compiler kyun nahin? Compiler woh smart part hai jo numbers, types, aur order of operations samajhta hai. Lekin woh tumhara macro name dekhta hi nahin — robot pehle hi usse mita chuka hota hai. Yahi is page ke har trap ki jad hai: substitution tab hoti hai jab koi math samajhne wala abhi aaya hi nahin hota.
PICTURE. Figure dekho. Left side par woh hai jo tumne type kiya. Robot SQUARE(x) ki har jagah underline karta hai aur, right side par, replacement text staple kar deta hai — koi soch nahin, koi arithmetic nahin, bas kainchi aur glue.

Step 2 — Naive macro: "no parentheses" ka matlab kya hota hai
KYA. Parent note ka jaanboojh kar todha gaya macro lo:
Yahan x parameter slot hai: ek placeholder jise robot fill karega. * literal multiplication text hai. Slots ke aaspaas koi brackets nahin hain — yeh yaad rakho, yahi poora crime hai.
Pehle broken wala kyun dikhayein? Kyunki khatara tab tak invisible hai jab tak slot mein kuch aisa na bhara jaaye jo ek akela number nahin hai. Slot mein akela 5 theek kaam karta hai; 2 + 3 jaisa expression nahin karta.
PICTURE. Figure template x * x ko do khaali amber slots ke saath dikhata hai. Har slot wahan hai jahan robot paste karega — aur khaas baat, woh jo bhi text tumne pass kiya, kachcha paste karta hai.

Step 3 — Argument paste karo (woh pal jab bug paida hota hai)
KYA. Hum BAD(2 + 3) likhte hain. Robot har x slot mein literal text 2 + 3 fill karta hai:
Result ko characters ki flat string ki tarah padho: 2 + 3 * 2 + 3. Abhi tak kisi ne kuch multiply nahin kiya — yeh abhi bhi sirf text hai.
Yeh trap kyun hai. Tumhara intention tha "(number 5) ka square". Lekin robot ne tumhara 2 + 3 kabhi group nahin kiya. Usne raw characters seedha * ke paas daal diye, 3 ko multiplication ke saath chipka diya.
PICTURE. Do amber 2 + 3 blocks ko slots mein slide karte dekho. Woh dashed group jo tum chahte the (har 2 + 3 ke aaspaas ek box) halka draw kiya gaya hai — aur actual pasted text mein woh missing hai.

Step 4 — Ab compiler aata hai aur precedence follow karta hai
KYA. Sirf ab smart compiler tayyar text 2 + 3 * 2 + 3 padhta hai aur arithmetic ke sadharan rules apply karta hai — Operator Precedence in C dekho. Multiplication addition se pehle bind karta hai, isliye pehle * group hota hai:
- Beech mein
3 * 2: yeh do teen tumhare argument ki alag-alag copies se aaye hain — pehle paste ki tail aur doosre ki head. - Bahar ke
2 +aur+ 3har taraf latke hue leftovers hain.
25 kyun nahin? Kyunki woh grouping jo tumne socha tha — har pasted 2+3 ke aaspaas ek box — text mein kabhi thi hi nahin. Precedence ek akela * dekhta hai, koi squared sum nahin.
PICTURE. Figure pehle 3 * 2 ko glowing dikhata hai (pehle evaluate hota hai), phir do orphan terms fold hokar 11 dete hain, aur paas mein chaha hua 25 cross out hai.

Step 5 — Fix: har slot aur poora body parenthesize karo
KYA. Isse parent note ke safe form mein rewrite karo:
Ab SQ(2 + 3) guarded slots mein paste karta hai:
- Inner
(x)— woh box jo robot ne Step 3 mein bhool gaya tha. Yeh force karta hai ki har pasted2 + 3multiply hone se pehle add ho. - Outer
( ... )— ek alag attack se guard karta hai: agar poora macro kisi bade expression mein baitha ho jaise1 / SQ(2), toh outer parens usse mis-group hone se rokta hai.
Do layers kyun? Ek layer andar ki cheez fix karta hai; doosra bahar ki cheez. Tumhe dono chahiye kyunki tum predict nahin kar sakte ki caller macro kahan drop karega.
PICTURE. Step 3 jaisa hi paste, lekin ab solid amber boxes har slot aur poore expression ko wrap karti hain — addition box ke andar hoti hai, answer clean 5 hai, phir 5×5.

Step 6 — Doosra trap: argument kitni baar run hota hai yeh count karna
KYA. Precedence fix ho gaya, lekin text-pasting mein aur gehri kharabi hai. Socho SQ(i++) correct macro ke saath. Yeh dono slots mein paste karta hai:
Yahan i++ sirf ek value nahin — yeh ek side effect wala command hai: "i use karo, phir i mein 1 jodo." Kyunki text i++ do baar copy hua, increment command do baar run karta hai.
Yeh 11 se bura kyun hai. 11 milna galat-par-defined hai. i++ ko do sequence points ke beech do baar run karna Undefined Behavior in C hai — standard result ke baare mein koi promise nahin karta; alag-alag compilers alag numbers dete hain, aur yeh silently optimization ke saath change ho sakta hai.
PICTURE. Do chote counters i++ label ke saath do slots mein baithe hain; figure dikhata hai i 3 se shuru hota hai aur do baar upar nudge hota hai, side effect par red "⚠ evaluated 2×" tag ke saath.

Step 7 — Inline function dono traps ko kyun khatam karti hai
KYA. Inline function
ek real function ki tarah compile hoti hai. Jab tum square(2 + 3) ya square(i++) call karte ho, argument pehle ek single value mein evaluate hota hai, aur wahi ek value parameter x ko di jaati hai.
square(2 + 3): compiler2 + 3 = 5ek baar compute karta hai, phir5 * 5 = 25karta hai. Koi precedence trap nahin — re-glue karne ke liye kuch hai hi nahin, kyunki ek value (5) andar gayi, text2 + 3nahin.square(i++):i++ek value produce karne ke liye bilkul ek baar run hota hai; side effect ek baar hota hai. Body phir us stored value ko khud se multiply karta hai. Koi double increment nahin.
Yeh by construction safe kyun hai. Ek function mein ek parameter hota hai — ek labelled box jo ek evaluated value hold karta hai. Body ke andar, x us box ka naam hai, caller ke original text ka nahin. Aur kyunki yeh compiler ke andar hai, jab yeh inline hota hai toh Function Call Overhead phir bhi remove ho jaata hai — tum kuch pay nahin karte phir bhi safety milti hai.
PICTURE. Argument ek single "evaluate once" gate se guzar kar box x mein jaata hai; body us box ko do baar padhta hai, lekin input sirf ek baar compute hua tha. Contrast panel Step 6 ka macro ka two-gate leak dikhata hai.

Ek picture mein summary
KYA. Ek frame poora page compress karta hai: wahi call do pipelines se guzarti hai. Macro wali raah mein, SQ(2+3) text ki tarah paste hoti hai, aur sirf baad mein precedence kaatta hai → 11 aur double side-effects ka risk. Inline wali raah mein, 2+3 pehle 5 mein evaluate hota hai, phir square hota hai → hamesha 25, hamesha ek baar.

Recall Feynman retelling — plain words mein zor se bolo
Tumhare liye ek number square karne ke liye do helper hain. Paste helper (macro) math bilkul nahin samajhta; woh bas jo tumne likha hai usse do jagah photocopy kar deta hai. Toh agar tumne "2 + 3" likha, woh "2 + 3 * 2 + 3" chipa deta hai, aur math-teacher jo baad mein check karta hai — "times before plus" maan ke — 11 paata hai, 25 nahin. Aur bura, agar tumne "i mein ek jodo" (i++) likha, woh us command ko dono jagah photocopy karta hai, toh i do baar badh jaata hai — ek aisa result jo koi predict bhi nahin kar sakta. Smart helper (inline function) pehle samajhta hai tumhara matlab kya tha — "2 + 3 yaani 5 hai" — ek labelled box mein akela number 5 likhta hai, aur tabhi square karta hai: 25, har baar, kisi bhi side effect ke saath bilkul ek baar hota hai. Paste helper ko boxes (parentheses) khench ke har slot ke aaspaas aur poori cheez ke aaspaas fix karo — lekin smart helper ko koi fix ki zaroorat hi nahin thi, kyunki usne copy karne se pehle socha. Dono ek door kitchen tak lamba safar (yaani Function Call Overhead) skip karte hain; sirf ek raaste mein thehokar girta hai.
Connections
- C Preprocessor — woh robot jo Steps 1–3 mein text pasting karta hai
- Operator Precedence in C — woh rule jo pasted text ko Step 4 mein 11 bana deta hai
- Function Call Overhead — woh cost jo dono techniques hata deti hain
- Undefined Behavior in C — Step 6 mein double-evaluation ka khatara
- const and constexpr — constant macros ke typed, value-based alternatives
- Compiler Optimization — decide karta hai ki Step 7 ka inline body actually paste hoga ya nahin