2010-08-11 14 views
8

मैं वर्तमान में निम्न कार्य और संकलक (MSVC2008/साथ ही 2010 तक) यह के बारे में शिकायत नहीं है लेकिन मुझे यकीन है कि नहीं कर रहा हूँ अगर यह एक बुरा विचार है या नहीं है:#endif कानूनी के बाद टोकन हैं?

#ifndef FOO_H_ 
#define FOO_H_ 

// note, FOO_H_ is not a comment: 
#endif FOO_H_ 

मैं हमेशा लिखने के लिए इस्तेमाल किया यह #endif // FOO_H_ के रूप में है लेकिन मैंने खुद को आज ऐसा नहीं किया और सोचा कि यह अजीब था क्योंकि स्पष्ट रूप से मैंने थोड़ी देर के लिए टिप्पणी विधि नहीं की है।

क्या यह बुरा अभ्यास है कि मुझे अपने सभी शीर्षकों के माध्यम से वापस जाना चाहिए और ठीक करना है (यह एक क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन है) या क्या यह इसे छोड़ने के लिए ठीक है?

+0

के बाद चीजें मुझे जीसीसी (अतिरिक्त टोकन) के साथ चेतावनी मिलती है, इसलिए मैं इसका सुझाव नहीं दूंगा। – UncleBens

+0

मैं यह पूछने की कोशिश कर रहा था कि मानक के संबंध में यह एक स्वीकार्य चीज है - या यदि यह विशिष्ट या कुछ और लागू था - मुझे सच में यकीन नहीं है। शायद सबसे अच्छा शब्द "यह उचित है?" - किसी भी तरह से जब मैं ऐप को अन्य ओएस पर संकलित करता हूं तो मुझे चेतावनी नहीं चाहिए इसलिए मैं उन्हें हटा दूंगा - धन्यवाद। –

+0

@ जो: क्षमा करें, मैंने गलत सवाल पढ़ा है। – GManNickG

उत्तर

6

सख्ती से बोलते हुए (मानक में व्याकरण के अनुसार) #endif के बाद किसी भी टोकन को निर्देश नहीं दिया जाता है (टिप्पणियां ठीक होती हैं क्योंकि प्रीप्रोसेसिंग निर्देशों - चरण 3 बनाम से अनुवाद के पहले चरण में उन्हें हटा दिया जाता है। 4)।

हालांकि, एमएसवीसी इसे अनुमति देने के लिए प्रतीत होता है - मैं इन्हें ठीक करने के लिए एक खोज पर नहीं जाऊंगा (क्योंकि वे कोई समस्या नहीं पैदा कर रहे हैं), लेकिन शायद हेडर को संशोधित करने के लिए उन्हें मानसिक रूप से ठीक करने के लिए एक मानसिक नोट बनाना होगा उनके साथ है।

बेशक, यदि आपके अन्य समर्थित कंपाइलर्स उनके बारे में निदान जारी करते हैं तो शायद उन्हें ठीक करने के लिए यह अधिक जरूरी है।

+0

मेरी मुख्य चिंता यह थी कि जब एप्लिकेशन को अन्य ओएस के लिए पोर्ट किया जाता है तो यह कुछ कारण हो सकता है यदि इस व्यवहार की अनुमति नहीं है, और चूंकि यह नहीं है, तो मैं इसे ठीक कर दूंगा। वास्तव में वैसे भी इतना लंबा नहीं लेना चाहिए। हालांकि धन्यवाद! –

5

यह ठीक नहीं है, यह मान्य नहीं है, AFAIK। कई कंपाइलर #endif के बाद अतिरिक्त टेक्स्ट को अनदेखा करते हैं और अक्सर वे इसके बारे में चेतावनी देते हैं। इसे टिप्पणी करने के लिए आपको // जोड़ना चाहिए।

+0

ठीक है, मैं इस पर कोई चेतावनी नहीं ढूंढ रहा हूं इसलिए मैं वापस जाऊंगा और इसे ठीक करूँगा, धन्यवाद! –

4

हर किसी के साथ पोस्ट किए जाने के साथ, मुझे लगा कि मैं वास्तव में इस मुद्दे को सही करने में आपकी सहायता कर सकता हूं। (मान लीजिए कि यह कई फाइलों में है।)

आप दृश्य स्टूडियो में एक बार में सभी समस्याग्रस्त लाइनों को सही करने के लिए ढूँढें और बदलें सुविधा का उपयोग कर सकते हैं। बस सेट करें: "\#endif {[a-zA-Z\.\_]+}$" और इसके साथ बदलें: "#endif //\1" (और सुनिश्चित करें कि आपके पास उपयोग विकल्पों के तहत चेक किया गया है: [नियमित अभिव्यक्तियां]।)

और पूरे समाधान पर ऐसा करें और आपको जाने के लिए अच्छा होना चाहिए।

(कृपया अपनी परियोजना का बैक अप पहले, मैं इस परीक्षण किया है और यह के रूप में इरादा लेकिन अपने जोखिम पर इस का प्रयोग करें काम कर रहा है।)

+0

ओह अब यह कमाल है, मुझे नहीं पता था कि आप खोज और बॉक्स को प्रतिस्थापित करने में regexp का उपयोग कर सकते हैं। मैं उनके साथ बहुत अच्छा नहीं हूं, हालांकि, यह मुझे "पैटर्न में सिंटेक्स त्रुटि" बता रहा है और "#endif {[a-zA-Z ._] +} $" को हाइलाइट कर रहा है - क्या मैं कुछ गलत कर रहा हूं? - संपादित करें: ओह, # में इसका उपयोग नहीं कर सकते हैं या यह इसे तोड़ देता है। यह अब काम कर रहा है, बहुत बहुत धन्यवाद! –

+0

# के सामने slashes (\) होना चाहिए। तथा _। यकीन नहीं है कि वे क्यों हटा दिए गए? (इस तरह: \ #endif {[a-zA-Z \। \ _] +} $) – TJMonk15

+0

@ जो.एफ ने इसे _ से पहले हटा दिया। यकीन नहीं है कि क्यों। बस इसे वापस जोड़ें और आप अच्छे होंगे। – TJMonk15

1

क्यों अपने संकलक आप इसके बारे में चेतावनी दी है चाहिए।

मान लें कि आपका हेडर फाइल इस तरह है:

#ifndef X 
#define X 
// STUFF 
// The next line does not contain an EOL marker (can happen) 
#endif 

अब आप स्रोत से इस में शामिल हैं

#include "plop.h" 
class X 
{ 
} 

जब संकलक फ़ाइल शामिल तकनीकी रूप से विस्तार किया स्रोत इस

#define X 
// STUFF 
// The next line does not contain an EOL marker (can happen) 
#endif class X 
{ 
} 
की तरह दिखना चाहिए

अधिकांश आधुनिक कंपाइलर ध्यान में रखते हैं कि वह हो सकता है और एक अतिरिक्त ईओएल चिपक सकता है इसे होने से रोकने के लिए शामिल फ़ाइलों पर टोकन (तकनीकी रूप से अनुमति नहीं है, लेकिन मैं ऐसी स्थिति के बारे में नहीं सोच सकता जहां यह समस्या पैदा करेगी)।

समस्या यह है कि कुछ पुराने कंपाइलर इस अतिरिक्त टोकन (अधिक मानक अनुपालन) प्रदान नहीं करते हैं, नतीजतन आप उपरोक्त कोड को संकलित करने के संभावित रूप से समाप्त कर सकते हैं (परिणामस्वरूप वे आपको दो चीजों के बारे में चेतावनी देते हैं 1) स्रोत फाइलों में ईओएल गायब है और 2) #endif