2010-02-12 11 views
8

पर जीसीसी के साथ std :: cout का उपयोग करने में समस्या मैं सी ++ प्रोग्रामिंग के लिए नया हूं और मैं टर्मिनल में जीसीसी का उपयोग कर मैक पर अपना पहला अभ्यास करने की कोशिश करता हूं।सी ++: मैक ओएसएक्स

दुर्भाग्य से, मैं iostream से संबंधित मुद्दों के कारण संकलित नहीं कर सकता। के रूप में एक साधारण प्रोग्राम के साथ:

#include "<"iostream">" 

int main() 
{ 

std::cout << "hello world"; 
std::cout << endl; 
return 0; 
} 

यह मुझे त्रुटि देता है:

error: ‘endl’ was not declared in this scope 

अदालत < < endl को हटाने; लाइन मुझे ये त्रुटियां देती है:

Undefined symbols: 
    "___gxx_personality_v0", referenced from: 
     ___gxx_personality_v0$non_lazy_ptr in cceBlyS2.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in cceBlyS2.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     _main in cceBlyS2.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in cceBlyS2.o 
    "std::cout", referenced from: 
     __ZSt4cout$non_lazy_ptr in cceBlyS2.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

यह स्पष्ट है कि iostream शीर्षलेख ठीक से लिंक नहीं है। मैंने बिना किसी सफलता के "<" iostream.h ">" और "iostream.h" की कोशिश की।

क्या किसी के पास कोई संकेत है जो मेरी मदद कर सकता है? धन्यवाद!

उत्तर

1

आपको बस std::endl; का उपयोग करने की आवश्यकता है। या, बेहतर अभी तक, काम using निर्देश का इस्तेमाल करते हैं:

#include <iostream> 

using namespace std; 

int main() 
{ 
    cout << "hello world"; 
    cout << endl; 
    return 0; 
} 
+0

यह नामस्थान के उद्देश्य से 'नामस्थान std :: x;' के लिए नाम दिया गया है, जिसे किसी दिए गए 'x' के लिए उपयोग किया जाना चाहिए, जिसे आप पूरे नामस्थान को दायरे में लाने के बजाय पहुंचने की आवश्यकता है। –

+2

@ क्रिस: मैं असहमत हूं। जबकि मैं निश्चित रूप से * हेडर फ़ाइल * में 'नेमस्पेस std;' जैसे कुछ से बचूंगा, मुझे लगता है कि यह एक स्रोत फ़ाइल के अंदर बिल्कुल ठीक है, विशेष रूप से इस तरह एक सरल। मुझे स्रोत फ़ाइल को 'std ::' के साथ पूरी जगह तक प्रदूषित करने का कोई कारण नहीं दिखता है जब तक कि यह बिल्कुल जरूरी नहीं है। मैं कभी भी ऐसे नाम का दोबारा उपयोग नहीं करना चाहूंगा जो पहले ही एसटीएल में इस्तेमाल किया गया था। पूरे नामस्थान में लाने से मुझे इस तरह की गलती जल्दी मिल जाएगी। –

+0

@ ई.जेम्स: इसके साथ एक मामूली समस्या है: आपको नहीं पता कि 'std' नेमस्पेस में क्या है - यह कार्यान्वयन के बीच भिन्न हो सकता है और करता है। आप मनमाने ढंग से समय के लिए कुछ ठीक काम कर सकते हैं, और फिर एक अलग (ए) संस्करण संकलक पर काम करना छोड़ दें। माना जाता है कि * इस * मामले में, जहां * केवल * नाम जिसे आप परिभाषित कर रहे हैं वह 'मुख्य' है, वहां बहुत कुछ गलत नहीं हो सकता है - लेकिन जब आप उससे अधिक कुछ करते हैं, तो यह एक पूरी कहानी है। –

17

आप उपयोग करने की आवश्यकता "std :: endl;" - संपूर्ण मानक लाइब्रेरी std नामस्थान में है। ऐसा लगता है कि आप कमांड लाइन पर g++ के बजाय gcc का उपयोग करते हैं। उत्तरार्द्ध स्वचालित रूप से C++ को सही ढंग से लिंक करने के लिए आवश्यक चरणों को करता है।

+0

आप के लिए कृतज्ञता! सब कुछ अब काम करता है। मेरे जैसे कुल नौसिखिया की मदद करने के लिए धन्यवाद! – Patof

+1

मैं बस सी ++ सीखना शुरू कर रहा हूं, मैं बस इतना कह सकता हूं, वाह, मुझे नहीं पता था कि जीसीसी और जी ++ (दुह) के बीच एक अंतर था, मेरे जीवन को बचाया। धन्यवाद दोस्त। – DarkMantis

7

endl;std नाम स्थान के अंतर्गत आती है

अपने 2 विकल्प इस प्रकार हैं:

1) अपने नाम स्थान है, उदा घोषित

#include <iostream> 
using namespace std; 

int main() { 
cout << "hello world"; 
cout << endl; 
return 0; 
} 

या std::endl; उदा।

std::cout << "hello world"; 
std::cout << std::endl; 
return 0; 

देखें कि कौन सा आपको उपयुक्त बनाता है। मैं अनुशंसा करता हूं 1) (जांचें कि मैंने std::cout नहीं किया क्योंकि मैंने पहले ही अपना नामस्थान घोषित कर दिया है) क्योंकि यह हर बार std:: टाइपिंग को कम करने में मदद करता है।