2010-02-12 10 views
8

Sono nuovo alla programmazione in C++ e cerco di fare il mio primo esercizio su un mac usando gcc nel terminale.C++: problema nell'uso di std :: cout con gcc su un osx

Purtroppo, non riesco a compilare a causa di problemi relativi a iostream. Con un semplice programma come:

#include "<"iostream">" 

int main() 
{ 

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

mi dà l'errore:

error: ‘endl’ was not declared in this scope 

rimuovere il cout < < endl; linea mi dà questi errori:

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 

È evidente che l'intestazione iostream non è collegata correttamente. Ho provato "<" iostream.h ">" e "iostream.h" senza successo.

Qualcuno ha qualche suggerimento che potrebbe aiutarmi? Grazie!

risposta

1

Hai solo bisogno di usare std::endl;. O, meglio ancora, utilizzare la comoda using direttiva:

#include <iostream> 

using namespace std; 

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

È meno contro lo scopo di un namespace di "usare namespace std :: x;" per un dato 'x' che è necessario accedere, piuttosto che portare l'intero spazio dei nomi in ambito in un colpo solo. –

+2

@Chris: non sono d'accordo. Mentre eviterei sicuramente qualcosa come 'using namespace std;' in un * file di header *, penso che sia perfettamente a posto in un file sorgente, specialmente uno semplice come questo. Non vedo alcun motivo per inquinare il file sorgente con 'std ::' dappertutto, a meno che non sia assolutamente necessario. Inoltre, preferirei non riutilizzare mai un nome già utilizzato nell'STL. Portare tutto lo spazio dei nomi mi permetterebbe di cogliere presto un simile errore. –

+0

@ e.James: c'è un piccolo problema con questo: non si sa cosa c'è nel namespace '' std' - può e varia tra le implementazioni. È possibile avere qualcosa che funzioni bene per un periodo di tempo arbitrario e quindi interrompere il lavoro su un compilatore diverso (versione di a). Certo, in * questo * caso, dove il solo * nome che stai definendo è 'main', non c'è molto che possa andare storto - ma quando/se fai qualcosa di più, è tutta un'altra storia. –

17

È necessario utilizzare "std :: endl;" - l'intera libreria standard si trova nello spazio dei nomi std. Sembra anche che tu abbia usato gcc invece di g++ sulla riga di comando. Quest'ultimo esegue automaticamente i passaggi necessari per collegare correttamente C++.

+0

Gratitudine per voi! Tutto funziona ora. Grazie per l'aiuto di un novizio totale come me! – Patof

+1

Sto appena iniziando ad imparare il C++, tutto quello che posso dire è, Wow, non sapevo che ci fosse una differenza tra GCC e G ++ (duh), mi ha salvato la vita. Grazie uomo. – DarkMantis

7

endl; rientra nella std namespace sono

tuoi 2 opzioni nel modo seguente:

1) dichiarare lo spazio dei nomi, ad esempio,

#include <iostream> 
using namespace std; 

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

o utilizzando std::endl; ad es.

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

Vedere quale si adatta. Mi raccomando 1) (Controlla che non l'abbia fatto std::cout perché ho già dichiarato il mio spazio dei nomi) perché aiuta a ridurre la digitazione std:: ogni volta.

Problemi correlati