2011-02-01 9 views
16

सी ++ में आमतौर पर नामित गार्ड शामिल हैं? मुझे यह बहुत कुछ देखने लगता है:नामकरण गार्ड शामिल करें

#ifndef FOO_H 
#define FOO_H 

// ... 

#endif 

हालांकि, मुझे नहीं लगता कि यह बहुत सहज है। फ़ाइल नाम को देखे बिना यह कहना मुश्किल है कि FOO_H क्या है और इसका नाम क्या है।

सर्वोत्तम अभ्यास माना जाता है?

+2

नाम कम या ज्यादा सहज हो सकता है, इस तथ्य के साथ वह यह है कि एक छोटा सा अनुभव आप उन पंक्तियों को पढ़ना बंद कर देते हैं। आंखों और मस्तिष्क का उपयोग '#ifdef blahblah ... 'में किया जाता है और मैं शायद ही कभी वास्तव में पढ़ता हूं कि क्या जांच रहा है, इसमें एक गार्ड शामिल है। –

+3

इस पर कुछ हद तक उपयोगी दृष्टिकोण: http://stackoverflow.com/questions/1744144/adding-an-include-guard-breaks-the-build/1744302#1744302 –

+0

सी ++ विकास करने वाला कोई भी व्यक्ति हेडर गार्ड को पहचानने के लिए बेहतर उपयोग करता था बहुत जल्दी। यह हमेशा आपके द्वारा देखे जा रहे मानक का पालन करेगा। "बेस्ट" अभ्यास (उद्धरणों में क्योंकि यह आवश्यक है) पहले ifndef डालना है, तुरंत बाद परिभाषित करें, और फ़ाइल के अंत में इसे खत्म करें। मेरा सुझाव है कि आप इस एप को पहचानना सीखें। –

उत्तर

15

अपने अनुभव से, सम्मेलन में हेडर फ़ाइल के बाद इन्हें शामिल करने के लिए सम्मिलन गार्ड का नाम है, यह नाम अपवाद के साथ है और यह नाम अंडरस्कोर के साथ बदल दिया गया है।

तो test.hTEST_H बन जाता है।

इस के वास्तविक जीवन उदाहरणों में क्यूटी निर्माता शामिल है, जो ऑटो-जनरेटिंग क्लास हेडर फाइलों के दौरान इस सम्मेलन का पालन करता है।

+4

केवल FILENAME_H का उपयोग करना शामिल है क्योंकि इसमें गार्ड नाम शामिल है क्योंकि आप सभी फाइलों के लिए सभी फाइलें और सभी पुस्तकालयों को उसी निर्देशिका में रखते हैं, बिना किसी उपनिर्देशिका के, इसलिए आप जानते हैं कि उनके पास कभी भी विरोधाभासी फ़ाइल नाम नहीं हैं ... –

+2

हालांकि यह सामान्य अभ्यास है , यह #Dfines और अन्य नामों के साथ आपकी दुकान के साथ क्या करता है, इस पर निर्भर करता है कि यह पर्याप्त नहीं हो सकता है। –

1

मैं आमतौर पर FOO_H_INCLUDED_ जैसे कुछ का उपयोग करता हूं। कुछ (माइक्रोसॉफ्ट) शीर्षलेखों में एक GUID के स्ट्रिंग प्रस्तुति की तरह बहुत कुछ दिखता है, लेकिन मुझे कभी भी विस्तृत जानकारी की आवश्यकता नहीं है।

3

FOO_H_INCLUDED के साथ बदलें और यह स्पष्ट है।

1

आमतौर पर लोग फ़ाइल नाम से ऐसा करते हैं ताकि प्रत्येक फ़ाइल का कोड केवल संकलित हो और एक बार जोड़ा जा सके। आप जो भी चाहें FOO_H बना सकते हैं, लेकिन लगभग हर चीज जिसे मैंने कभी भी देखा या देखा है, ने फ़ाइल नाम का उपयोग किया है। बस यह सुनिश्चित करें कि यह अद्वितीय है क्योंकि आप नहीं चाहते हैं कि आपका FOO_H किसी और के FOO_H से विवाद कर रहा हो।

10

google's style guide से सीधे लिया गया:

सभी हेडर फाइल शामिल किए जाने के रोकने के लिए #define गार्ड होना चाहिए। प्रतीक नाम का प्रारूप < प्रोजेक्ट> _ < पाथ> _ < FILE> _H_ होना चाहिए। विशिष्टता की गारंटी के लिए, उन्हें प्रोजेक्ट के स्रोत पेड़ में पूर्ण पथ के आधार पर होना चाहिए।

#ifndef FOO_BAR_BAZ_H_ 
#define FOO_BAR_BAZ_H_ 
... 
#endif // FOO_BAR_BAZ_H_ 

मैं अपने ही परियोजनाओं में इस शैली का उपयोग: उदाहरण के लिए, फ़ाइल foo/src/बार/परियोजना foo में baz.h निम्नलिखित गार्ड होना चाहिए।

+5

हालांकि आम तौर पर Google कोडिंग मानक बोलना मैंने कभी भी देखा है, मैं नामस्थान के साथ उपसर्ग करता हूं। यदि आपके पास एकाधिक नामस्थानों में समान नामों के साथ कुछ भी है तो यह बिल्कुल जरूरी है। –

+0

मैं यह पता लगाने की कोशिश कर रहा हूं, पीछे पीछे अंडरस्कोर के पीछे कोई तर्क है? – Toby

+1

@Toby बस इसे (अधिक) अद्वितीय बनाने के लिए ...अगर किसी के पास पहले से ही 'CONFIG_H' है (जैसे एक लाइब्रेरी शामिल है) तो' CONFIG_H_' का उपयोग करके इसके साथ संघर्ष नहीं होगा। वही कारण कुछ लोग एक अग्रणी अंडरस्कोर का उपयोग करते हैं, लेकिन उन्हें नहीं चाहिए क्योंकि थैग आरक्षित हैं। – RastaJedi

1

मैं आमतौर पर देखता हूं कि यह कितना समय है और इसे इसके अंत में संलग्न करें, यानी FOO_H_248, यह एक अतिरिक्त सावधानी है, और आपको इसे कभी भी याद रखना नहीं होगा, इसलिए आपको चिंता करने की आवश्यकता नहीं है तथ्य यह है कि यह गूढ़ है।

+0

क्या आप 12 या 24 घंटे की घड़ी का उपयोग करते हैं और क्या यह स्थानीय समय है? ;-) – T33C

+5

@ टी 33 सी: 12? 24? तुम्हारी किस बारे में बोलने की इच्छा थी? यह सिर्फ एक नियमित 17 घंटे की घड़ी है। और यह उस समय स्थानीय समय है जहां पोप उस समय है। –

2

दूसरों से पहले उल्लेख किया है, एक बहुत ही आम सम्मेलन नाम की अपरकेस संस्करण, और डॉट एक अंडरस्कोर द्वारा प्रतिस्थापित उपयोग करने के लिए है: foo.h -> FOO_H

हालांकि, इस के साथ नाम टकराव का कारण बन सकता सरल और/या आम नाम। इस कारण से, गैर खाली विज़ुअल सी सी ++ परियोजनाओं में stdafx.h की तरह स्वत: जनरेट की शीर्ष लेख संलग्न कुछ यादृच्छिक स्ट्रिंग, जैसे:

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS 
#define FOO_H__NsknZfLkajnTFBpHIhKS 
#endif 

http://www.random.org/strings/ इस के लिए एक उपयोगी यादृच्छिक जनरेटर है।कोड है कि # के अपने शीर्ष लेख शामिल पर

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS 
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS 

namespace somecomponent 
{ 
    ... 
} 

#endif 
+4

डबल अंडरस्कोर के कारण ये आरक्षित नाम हैं। तो इसका उपयोग करने के लिए यह अच्छा अभ्यास नहीं है। –

4

देखो:

इसके अलावा, अगर फ़ाइल कुछ submodule का हिस्सा है, या उसकी सामग्री एक विशिष्ट नाम स्थान में रहते हैं, मैं भी गार्ड को जोड़ने के लिए करते हैं ।

यदि यह कुछ ऐसा है:

#include "mylib/myheader.h" 

mylib/myheader.h पहले से ही एक अनूठा नाम है। बस पूंजीकरण और प्रतिस्थापित करें/और। साथ _

#define MYLIB_MYHEADER_H 

आप अपने साथ शामिल करने के लिए पथ में एक ही नाम के सापेक्ष पथ शामिल पर दो हेडर है, तो आप पहले से ही उस स्तर पर एक टक्कर की है।

16

मैं व्यक्तिगत रूप से बूस्ट की सिफारिश का पालन करता हूं। यह शायद अच्छी गुणवत्ता के सी ++ पुस्तकालयों का सबसे बड़ा संग्रह है और उन्हें कोई समस्या नहीं है।

यह प्रकार है:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED 

// include/pet/project/file.hpp 
#ifndef PET_PROJECT_FILE_HPP_INCLUDED 

जो है:

  • कानूनी (ध्यान दें _[A-Z] द्वारा कि शुरुआत या युक्त __ नहीं है)
  • आसान उत्पन्न करने के लिए
  • अद्वितीय होने की गारंटी (एक गार्ड के रूप में) एक परियोजना के भीतर (अन्यथा आपके पास एक ही स्थान पर दो फाइलें हैं)
  • गारंटी नहीं कुछ और के लिए प्रयोग की जाने वाली (यदि आप INCLUDED के साथ एक और मैक्रो अंत आप एक लड़ाई के लिए खराब कर रहे हैं)

मैं GUID के बारे में पढ़ा है, लेकिन उन अजीब लग रहे हो।

और स्पष्ट रूप से मैं नहीं बल्कि सभी compilers से #pragma once लागू चाहते हैं (या बेहतर, #pragma multiple और "एक बार" हो डिफ़ॉल्ट व्यवहार ...)

+0

व्यक्तिगत रूप से, मुझे लगता है कि एक्सटेंशन जोड़ना अनावश्यक है, लेकिन मुझे लगता है कि _INCLUDED वास्तव में कहता है कि इसके लिए क्या खड़ा है, इसके लिए +1। मेरी प्राथमिकता INCLUDE_GUARD_FOO का उपयोग करना है (अनावश्यक _H के बिना, हमें केवल हेडर के लिए गार्ड शामिल करना होगा), जो बिंदु इहोहो के लिए थोड़ा और भी है, लेकिन यह वास्तव में स्वाद का मामला है। – cmaster

+0

@cmaster _H का अतिरिक्त परिस्थितियों में सहायक हो सकता है जहां आपके पास कुछ कार्यक्षमता का सी और सी ++ कार्यान्वयन है (क्रमशः .h और a .hpp फ़ाइल का उपयोग करके)। – Squirrel