2010-02-13 13 views
6

तो मैं कुछ सरल सी ++ अभ्यास कर रहा था और मैंने एक दिलचस्प कामयाबी देखी। बेयर मेटल एक करने के लिए नीचे उबला हुआ निम्नलिखित कोड संकलन बाहर की कोशिश कर सकते:सी ++ में "अच्छा" कीवर्ड?

<file>.cpp: In function ‘int main()’: 
<file>.cpp:11: error: expected `;' before ‘n’ 
<file>.cpp:11: warning: statement is a reference, not call, to function ‘nice’ 
<file>.cpp:11: warning: statement has no effect 

और यह नियमित रूप से जी ++ उपयोग कर रहा था Mac OS X पर:

class nice 
{ 
    public: 
    nice() {} 
}; 

int main() 
{ 
    nice n; 
    return 0; 
}; 

परिणाम एक संकलन त्रुटि है कि कुछ इस तरह चला जाता है , मेरे कुछ दोस्तों ने उबंटू पर भी कोशिश की है, वही परिणाम प्रदान करते हैं।

यह काम "अच्छा" शब्द में झूठ बोलता प्रतीत होता है, क्योंकि इसे पुन: सक्रिय करने से हमें संकलन करने की अनुमति मिलती है। अब, मुझे सी ++ या सी के लिए कीवर्ड लिस्टिंग में "अच्छा" नहीं मिल रहा है, इसलिए मैं सोच रहा था कि अगर किसी को यहां कोई विचार है?

इसके अलावा,

nice n; 

समस्या ठीक करता है के बजाय

class nice n; 

डाल।

पीएस मैं एक सापेक्ष सी ++ नौसिखिया हूं, और एक्शनस्क्रिप्ट/.NET/जावा/पायथन दुनिया से आया हूं।

अद्यतन:

ठीक है, मेरा बुरा है, मैं भी एक

#include <iostream> 
शीर्ष है, जो समस्या के मूल प्रतीत हो रहा है पर

, क्योंकि इसके बिना सब कुछ ठीक काम करता है के लिए किया था।

+0

समस्या की जड़ '#' शामिल नहीं है, लेकिन 'नामस्थान std' का उपयोग कर रहा है! – James

+0

@Autopulated - मुझे नहीं लगता कि यह नामस्थान std है, यह वैश्विक नामस्थान के साथ एक संघर्ष है। में खींच रहा है और यह :: अच्छा() – Duck

+0

के साथ विरोधाभासी है। ऐसा लगता है कि यह "std" नामस्थान है, जैसा कि कई लोगों ने कहा है। एक बार जब आप इसकी पुष्टि कर लेंगे, तो कृपया उन उत्तरों में से एक को "स्वीकृत" (हरा चेकमार्क) के रूप में चिह्नित करें, जो वास्तव में उत्तर नहीं है। – MatrixFrog

उत्तर

3

यह नामस्थान समस्या है लेकिन नामस्थान std के साथ नहीं है। हैडर <iostream><unistd.h>

में खींच रहा है आप

class nice 
{ 
    public: 
     nice() {}; 
}; 

int main(int argc, char *argv[]) 
{ 
    nice n; 

    return 0; 
} 

कोशिश वहाँ कोई समस्या नहीं है। ", इससे पहले कि 'एन' उम्मीद ''" त्रुटि

सीधे शब्दों में

#include <unistd.h> 

जोड़ सकते हैं और आप मिल जाएगा। नेमस्पेस std तस्वीर में प्रवेश नहीं करता है।

तो समाधान पहले जैसा ही है - कक्षा को अपने नामस्थान में अच्छा लगा और यह वैश्विक :: अच्छा() के साथ संघर्ष नहीं करेगा।

2

यह मेरे लिए ठीक काम करता है। क्या आपने पोस्ट किए गए सटीक कोड का प्रयास किया था?

+1

ठीक है, नहीं, मेरे पास शीर्ष पर #include था :) शायद यह है। – oleks

17

शायद समस्या किसी भी तरह libc में nice फ़ंक्शन के कारण होती है। यह आपकी कक्षा printf नाम देने का प्रयास करने जैसा है।

4

using namespace std, किसी भी मौके से?

संपादित करें:

मानक का कहना है कि मानक हेडर नाम स्थान एसटीडी में अपने सभी प्रतीकों (17.4.1.2.4 देखें) परिभाषित करते हैं। एक फुटनोट, हालांकि, यह भी कहा कि < ज> वेरिएंट ग्लोबल नेम स्पेस में उनके नाम डंप - लेकिन निश्चित रूप से कोई भी इन का उपयोग करना चाहिए;)

+0

फुटनोट '' प्रकारों को संदर्भित करता है; सी से विरासत में प्राप्त आईएसओ सी ++ में ' 'का कोई .h संस्करण नहीं है। एक कार्यान्वयन एक प्रदान कर सकता है, हालांकि, मुख्य नाम आईएसओ सी ++ – MSalters

+0

@MSalters हाँ द्वारा आरक्षित नहीं है, बिल्कुल: एक सी हेडर नहीं है, इसलिए यह * किसी भी * प्रतीक को वैश्विक नामस्थान में नहीं डालता है। – James

3

इस संस्करण का प्रयास करें:

#include <iostream> 

namespace test 
{ 
    class nice 
    { 
    public: 
     nice() {} 
    }; 
}; 

using namespace std; 

int main() 
{ 
    test::nice n; 
    cout << "well I think this works." << endl; 
    return 0; 
} 

में इस मामले में मैंने अपना नामस्थान test परिभाषित किया है। ऐसा करने से, मैं जो भी वर्ग नाम पसंद करता हूं उसका उपयोग कर सकता हूं, जिसमें पहले से ही printf जैसे फ़ंक्शंस शामिल हैं। एकमात्र चीजें जिनका मैं पुन: उपयोग नहीं कर सकता, आरक्षित शब्द जैसे int या namespace हैं।

नोट: यदि आप कहते हैं:

using namespace test; 

साथ ही और अकेले nice को देखें तो आपको यह त्रुटि मिल जाएगा:

nice.cpp: In function ‘int main()’: 
nice.cpp:18: error: reference to ‘nice’ is ambiguous 
/usr/include/unistd.h:593: error: candidates are: int nice(int) 
nice.cpp:7: error:     class test::nice 

कौन सा मुझे लगता है कि अच्छी तरह से बताते हैं क्या हो रहा है - अब अच्छा दो नामस्थानों में मौजूद है और संकलक काम नहीं कर सकता कि आपका क्या मतलब है।

+0

यदि कोई उत्सुक है (जैसा कि मैं था), यहां फ़ंक्शन std :: nice() http://www.gnu.org/software/libc/manual/html_node/Traditional-Scheduling-Functions.html# के बारे में कुछ जानकारी दी गई है पारंपरिक-शेड्यूलिंग-फ़ंक्शंस (नीचे स्क्रॉल करें) – MatrixFrog

+0

हाँ, अच्छी तरह से लिनक्स कर्नेल द्वारा शेड्यूलिंग उद्देश्यों के लिए उपयोग किया जाने वाला मान है। यह सिर्फ मेरे लिए हुआ है कि यह क्या है ... –

+0

अच्छा() * st * में नहीं है, यह वैश्विक है। – Duck

संबंधित मुद्दे