5.1.31 · D1 · HinglishC Programming

FoundationsCompile-time assertions — static_assert

3,349 words15 min read↑ Read in English

5.1.31 · D1 · Coding › C Programming › Compile-time assertions — static_assert

Parent note ki ek bhi line padhne se pehle, tumhare saamne symbols aur words ka ek dhera aata hai: static_assert, sizeof, enum, #define, &, &&, "constant expression", "compile time", "diagnostic". Yeh page har ek cheez ko scratch se, us order mein build karta hai jisme agle concept ke liye pichhla concept zaroor samajh aaya ho.


0. Do clocks: compile time vs run time

Is poore topic ki neenv ek cheez pe tikki hai — kab koi cheez hoti hai. Toh hum wahaan se shuru karte hain.

Related runtime tool: assert (runtime assertions) right clock pe rehta hai. static_assert uska left-clock cousin hai.


1. "Value" kya hota hai, aur "zero" ka matlab

static_assert ka rule hai: "agar value zero hai, toh fail karo." Toh hume value ka matlab pakka karna hoga.

Toh jab parent note kehta hai "agar condition zero (false) hai, toh compilation fail" — matlab compiler ek number compute karta hai, aur sirf exact value hi stop trigger karti hai.


1b. Literals — woh raw numbers jo tum directly type karte ho

Comparisons aur sizeof se pehle, kisi bhi expression ki sabse basic ingredient woh plain number hota hai jo directly source mein likha ho. Uska ek naam hai.


2. Comparison operators: condition kaise number banti hai

static_assert ke andar condition usually sizeof(int) == 4 jaisi dikhti hai. Woh == asli kaam kar raha hai.

Toh static_assert(sizeof(int) == 4, "...") ka asli matlab hai: sizeof(int) == 4 se jo number bane use compute karo; agar woh number 0 hai, toh ruko.


3. sizeof — ek type ko ruler se naapna


3b. _Alignof — ek type ki alignment naapna

sizeof naapta hai ki type kitni badi hai. Uska close cousin _Alignof ek type ke baare mein alag compile-time fact naapता hai, aur yeh constant-expression list mein aata hai, toh hum ise abhi define karte hain.


4. #define — ek named constant jo preprocessor paste karta hai

Toh jab compiler tumhara code dekhta hai, BUFFER_SIZE already 1024 ban chuka hota hai. Yeh use ek constant bana deta hai jo compiler static_assert ke andar use kar sakta hai.


5. enum — auto-numbered named constants


6. Do alag "AND": & (bitwise) vs && (logical)

Parent ka power-of-two check (x & (x-1)) == 0 mein & use hota hai. Yeh logical "and" && nahi hai — woh alag sawaal ka jawab dete hain, toh hum dono define karte hain.


6b. Conditional operator ? : — do values mein se choose karna

Constant-expression list mein ek aur operator bhi allowed hai, ? :, jo shayad tumne abhi nahi dekha. Yeh C ka ek maatra aise operator hai jiske teen parts hote hain.


7. "Constant expression" — gatekeeper ka admission rule

Ab pehle ke har piece ko mila ke woh ek requirement banti hai jo static_assert ko govern karti hai.


8. static_assert khud — finally, syntax

Ab jab har ingredient exist karta hai, hum aakhirkar woh keyword define kar sakte hain jiske liye yeh poora page hai.


Equipment checklist

Right side cover karo aur khud test karo.

static_assert kis clock pe (compile ya run) kaam karta hai?
Compile time pe — program exist hone se pehle.
C mein kaun sa akela number false count hota hai?
0 (zero); har non-zero true hota hai.
C mein literal kya hota hai?
Woh value jo directly source mein likhi ho aur apne aap ke liye khadi ho, jaise 4, 'A', "text".
Expression a == b kya evaluate karta hai?
1 agar equal hain, 0 agar nahi — yeh ek number ban jaata hai.
sizeof(T) kya return karta hai, aur kis type ka?
Jitne bytes T occupy karta hai, unsigned size_t ke roop mein.
_Alignof(T) kya return karta hai?
Type T ki required byte alignment (spacing), ek compile-time size_t.
sizeof kab constant expression nahi hota?
Jab variable-length array (VLA) pe apply hota hai — uska size runtime value hai.
Compile time pe fixed array ke elements kaise count karte ho?
sizeof(arr) / sizeof(arr[0]).
Kya #defined naam runtime variable hai?
Nahi — yeh compile hone se pehle paste hone wala text hai, toh constant hai.
Unparenthesised #define kya pitfall cause karta hai?
Blind text substitution arithmetic badal sakti hai; hamesha body ko parentheses mein wrap karo.
enum { A = 4, B, C } mein B aur C kya hain?
B = 5 aur C = 6 — woh pinned start value se auto-increment karte hain.
& aur && mein kya fark hai?
& numbers ko bit-by-bit combine karta hai; && ek single yes/no sawaal puchta hai "kya dono non-zero hain?".
cond ? a : b kya produce karta hai?
a agar cond non-zero hai, warna b — yeh ek value yield karta hai.
x & (x - 1) == 0 kya test karta hai, aur x kya hona chahiye?
Whether x power of two hai; x ek non-negative compile-time constant hona chahiye.
static_assert mein diagnostic message kya hota hai?
Woh string jo compiler failure par print karta hai, explaining karta hai ki build kyun ruki.
C11 mein static_assert ke peeche raw keyword kya hai, aur kaise use hota hai?
_Static_assert(expr, "msg") — identical usage; <assert.h> mein macro static_assert bas ise alias karta hai.
static_assert kahaan rakha ja sakta hai?
Kahaan bhi jahan declaration allowed ho — file scope mein, struct ke andar, ya function ke andar.