अंतिम अद्यतन:2026-10-12
Open source C++ code कैसे पढ़ें¶
Open source project का code एक झलक में कैसे समझें?¶
वास्तविक projects या open source code में, खासकर C code, macros उपयोग करना पसंद करती है, जिससे एक बड़ी समस्या होती है: code पढ़ना बहुत मुश्किल हो जाता है, debugging दूसरी समस्या है, तो अगर आपको macros की बड़ी मात्रा वाला कोई project दिया जाए, तो उसे जल्दी कैसे समझें?
आमतौर पर interviews में हमें एक बहुत ज़रूरी knowledge point मिलता है: gcc compilation process, सब इसके बारे में धाराप्रवाह जवाब दे देते हैं, तो candidates का level अलग करने के लिए आगे बढ़ते हैं: आप gcc के कौन से compilation parameters जानते हैं, हर parameter का क्या काम है? Preprocessing stage में क्या होता है? आमतौर पर आप इस stage में क्या करते हैं, इससे आपको क्या मदद मिलती है?
इस section में एक open source project का उदाहरण लेकर देखते हैं कि code को कैसे झट से समझें!
नीचे libev का एक code है, जिसमें कई macros हैं, जैसे:
- EV_FREQUENT_CHECK
- assert
EV_P_- ANHE_w
- ANHE_at_cache
void noinline
ev_timer_start (EV_P_ ev_timer *w) EV_THROW
{
if (expect_false (ev_is_active (w)))
return;
ev_at (w) += mn_now;
assert (("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.));
EV_FREQUENT_CHECK;
++timercnt;
ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1);
array_needsize (ANHE, timers, timermax, ev_active (w) + 1, EMPTY2);
ANHE_w (timers [ev_active (w)]) = (WT)w;
ANHE_at_cache (timers [ev_active (w)]);
upheap (timers, ev_active (w));
EV_FREQUENT_CHECK;
/*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/
}
देखकर चक्कर आ रहे हैं न? इस code से कुछ प्रश्न निकलते हैं:
- Function के parameters कितने हैं?
- Function का type क्या है?
- Code में ev_at क्या चीज़ है?
Code को झट से समझने के लिए, हमें -E उपयोग करके preprocessing stage में macro expansion के बाद का code प्राप्त करना होगा, जिससे समझना और पढ़ना आसान हो।
Expansion के बाद, हमें मिलेगा:
void __attribute__ ((__noinline__))
ev_timer_start (struct ev_loop *loop, ev_timer *w)
{
if (__builtin_expect ((!!((0 + ((ev_watcher *)(void *)(w))->active))),(0)))
return;
((WT)(w))->at += ((loop)->mn_now);
# 3881 "ev.c" 3 4
((
# 3881 "ev.c"
("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.)
# 3881 "ev.c" 3 4
) ? (void) (0) : __assert_fail (
# 388libev: ev_timer_start called with negative timer repeat value\", w->repeat >= 0.)"
# 3881 "ev.c" 3 4
, "ev.c", 3881, __PRETTY_FUNCTION__))
# 3881 "ev.c"
;
do { } while (0);
++((loop)->timercnt);
ev_start (loop, (W)w, ((loop)->timercnt) + (4 - 1) - 1);
if (__builtin_expect ((!!((((W)(w))->active + 1) > (((loop)->timermax)))),(0))) { int __attribute__ ((__unused__)) ocur_ = (((loop)->timermax)); (((loop)->timers)) = (ANHE *)array_realloc (sizeof (ANHE), (((loop)->timers)), &(((loop)->timermax)), (((W)(w))->active + 1)); ; };
(((loop)->timers) [((W)(w))->active]).w = (WT)w;
(((loop)->timers) [((W)(w))->active]).at = (((loop)->timers) [((W)(w))->active]).w->at;
upheap (((loop)->timers), ((W)(w))->active);
do { } while (0);
}
अब code समझने में कोई खास बाधा नहीं है, लेकिन फिर भी पूरी तरह साफ़ नहीं है, दूसरे candidates से अपनी अलग पहचान दिखाने के लिए, मैं कुछ प्रश्न रखता हूँ:
- ऊपर बहुत सारी line numbers दिख रही हैं, क्या इन्हें हटाया जा सकता है, कैसे solve करें?
- ऊपर assert जैसे system macros बहुत सरल और समझने में आसान हैं, इन्हें expand करने की ज़रूरत नहीं, आप जानते हैं कैसे करना है?
- ऊपर के इन दोनों expansion steps में समस्या हो सकती है, क्या आप जानते हैं क्या हुआ और कैसे solve करें?
ठीक है, इस section में इतना ही, अगले section में sharing जारी रहेगा, ऊपर के उत्तरों पर comments में चर्चा करने के लिए स्वागत है!
संबंधित विषय¶
- C++ string के छह split तरीके | C++那些事
- CPython extension development notes | C++那些事
- libcurl C++ development notes | C++那些事
- एक दिलचस्प C++ code | C++那些事
- C++ loop के बिना 1-100 print करना | C++那些事