Include Guards
दोबारा शामिल होने से रोकें।
Include Guards, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
दोहरी समावेशन की समस्या
हेडर अक्सर अन्य हेडर शामिल करते हैं। एक ही स्रोत फ़ाइल में किसी हेडर का दो बार शामिल हो जाना आसान है।
ऐसा होने पर उसमें मौजूद हर घोषणा दो बार दिखाई देती है। struct या typedef जैसी प्रकार परिभाषाओं के लिए यह कंपाइलेशन त्रुटि है: किसी प्रकार को एक से अधिक बार परिभाषित नहीं किया जा सकता।
यह चुपके से कैसे होता है
मान लीजिए a.h और b.h, दोनों types.h को शामिल करते हैं। दोनों को शामिल करने वाली स्रोत फ़ाइल में types.h दो बार चिपका हुआ आ जाता है।
प्रीप्रोसेसर बिना जाँच के हेडर का टेक्स्ट कॉपी करता है, इसलिए types.h की परिभाषाएँ दोहर जाती हैं और पुनर्परिभाषा त्रुटि उत्पन्न होती है।
/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h" /* types.h now seen twice */समावेशन सुरक्षा-प्रबंध
समावेशन सुरक्षा-प्रबंध एक छोटी प्रीप्रोसेसर युक्ति है, जो हेडर को कई बार शामिल करना सुरक्षित बनाती है।
यह पूरे हेडर को एक शर्त के अंदर रखता है, ताकि बॉडी केवल पहली बार संसाधित हो। बाद के समावेशन पूरी तरह छोड़ दिए जाते हैं।
#ifndef TYPES_H
#define TYPES_H
/* header contents here */
#endif /* TYPES_H */सुरक्षा-प्रबंध कैसे काम करता है
पहली बार हेडर दिखाई देने पर TYPES_H परिभाषित नहीं होता, इसलिए #ifndef सत्य होता है और बॉडी संसाधित होती है। फिर #define मैक्रो सेट कर देता है।
बाद के किसी भी समावेशन पर TYPES_H पहले से मौजूद होता है, इसलिए #ifndef असत्य होता है और प्रीप्रोसेसर सीधे #endif तक चला जाता है।
#ifndef TYPES_H /* true only the first time */
#define TYPES_H /* remember we've been here */
/* ... body ... */
#endifएक पूर्ण सुरक्षित हेडर
यहाँ एक वास्तविक हेडर है, जिसमें किसी प्रकार की परिभाषा को सुरक्षा-प्रबंध से सुरक्षित किया गया है।
भले ही कई फ़ाइलें point.h को सीधे या परोक्ष रूप से शामिल करें, Point संरचना हर अनुवाद इकाई में ठीक एक बार परिभाषित होगी।
/* point.h */
#ifndef POINT_H
#define POINT_H
typedef struct {
int x;
int y;
} Point;
Point point_add(Point a, Point b);
#endifमैक्रो का नाम चुनना
सुरक्षा-प्रबंध मैक्रो आपके पूरे प्रोजेक्ट में अद्वितीय होना चाहिए, वरना दो हेडर आपस में टकराकर एक-दूसरे को चुपचाप छिपा सकते हैं।
एक सामान्य परंपरा फ़ाइल नाम से बड़े अक्षरों में नाम बनाना है: point.h से POINT_H और net/socket.h से NET_SOCKET_H बनता है।
#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endifआरक्षित नामों से बचिए
अंडरस्कोर के बाद बड़े अक्षर से शुरू होने वाले या डबल अंडरस्कोर वाले पहचानकर्ता कंपाइलर और मानक लाइब्रेरी के लिए आरक्षित होते हैं।
__POINT_H__ जैसे सुरक्षा-प्रबंधों से बचिए। POINT_H जैसा साधारण अंत वाला रूप सुरक्षित और स्पष्ट है।
#ifndef _POINT_H_ /* risky: reserved name pattern */
#ifndef POINT_H /* preferred */#pragma once का विकल्प
अधिकांश आधुनिक कंपाइलर #pragma once का समर्थन करते हैं। हेडर के शीर्ष पर लिखी यह एक पंक्ति वही काम करती है।
यह छोटा है और नामों के टकराव से बचाता है, लेकिन C मानक का हिस्सा नहीं है। पारंपरिक #ifndef सुरक्षा-प्रबंध हर जगह काम करते हैं।
/* point.h */
#pragma once
typedef struct { int x; int y; } Point;सुरक्षा-प्रबंध बनाम प्रैग्मा
#ifndef सुरक्षा-प्रबंध पूरी तरह पोर्टेबल और मानक हैं, लेकिन हर हेडर के लिए एक अद्वितीय मैक्रो आवश्यक होता है।
#pragma once छोटा और टकराव-मुक्त है, लेकिन कंपाइलर के समर्थन पर निर्भर करता है। कुछ प्रोजेक्ट अधिकतम सुरक्षा के लिए दोनों का उपयोग करते हैं: प्रैग्मा के साथ पारंपरिक सुरक्षा-प्रबंध।
#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endifसुरक्षा-प्रबंध प्रति अनुवाद इकाई होते हैं
समावेशन सुरक्षा-प्रबंध किसी एक स्रोत फ़ाइल को कंपाइल करते समय उसके भीतर दोहरे समावेशन को रोकता है।
यह किसी हेडर को अलग-अलग .c फ़ाइलों में एक-एक बार संसाधित होने से नहीं रोकता। यह ठीक है, क्योंकि हर स्रोत फ़ाइल एक अलग अनुवाद इकाई होती है।
इसे आदत बनाइए
आप जो भी हेडर लिखें, उसकी पहली ही पंक्ति से समावेशन सुरक्षा-प्रबंध जोड़िए। इसमें तीन पंक्तियाँ लगती हैं और उलझाने वाली त्रुटियों की पूरी श्रेणी रुक जाती है।
सरल हेडर भी बाद में अन्य हेडर के माध्यम से परोक्ष रूप से शामिल हो सकते हैं, इसलिए शुरुआत से सुरक्षा-प्रबंध लगाने पर परेशानी बचती है।
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endifत्वरित जाँच
समावेशन सुरक्षा-प्रबंधों की अपनी समझ जाँचिए।
पुनरावृत्ति
आपने सीखा कि हेडर को दो बार शामिल करने से पुनर्परिभाषा त्रुटियाँ क्यों होती हैं और समावेशन सुरक्षा-प्रबंध उन्हें कैसे रोकता है।
किसी अद्वितीय मैक्रो के साथ #ifndef/#define/#endif का उपयोग कीजिए, या #pragma once का। आगे हम extern की सहायता से फ़ाइलों के बीच वेरिएबल साझा करना देखेंगे।
एआई शिक्षक के साथ C सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “Include Guards” पाठ निःशुल्क है?
हाँ—“Include Guards” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Include Guards” में मैं क्या सीखूँगा?
दोबारा शामिल होने से रोकें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“Include Guards” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।