2010-02-12 17 views
8

Soy nuevo en la programación C++ y trato de hacer mi primer ejercicio en un mac usando gcc en la terminal.C++: Problema al usar std :: cout con gcc en mac osx

Desafortunadamente, no puedo compilar debido a problemas relacionados con iostream. Con un programa sencillo como:

#include "<"iostream">" 

int main() 
{ 

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

me da el error:

error: ‘endl’ was not declared in this scope 

retirar el cout < < endl; línea me da estos errores:

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 

Es evidente que el encabezado iostream no está vinculado correctamente. Intenté "<" iostream.h ">" y "iostream.h" sin éxito.

¿Alguien tiene alguna pista que pueda ayudarme? Gracias!

Respuesta

1

Solo necesita usar std::endl;. O, mejor aún, hacer uso de la mano using Directiva:

#include <iostream> 

using namespace std; 

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

Menos que el propósito de un espacio de nombres para 'usar namespace std :: x; 'para una' x 'determinada a la que necesita acceder, en lugar de poner todo el espacio de nombres en el alcance de una sola vez. –

+2

@Chris: No estoy de acuerdo. Aunque ciertamente evitaría algo como 'using namespace std;' en un * header file *, creo que está perfectamente bien dentro de un archivo fuente, especialmente uno simple como este. No veo ninguna razón para contaminar el archivo fuente con 'std ::' en todas partes a menos que sea absolutamente necesario. También preferiría nunca reutilizar un nombre que ya se usó en el STL. Traer todo el espacio de nombres me permitiría detectar un error tan temprano. –

+0

@ e.James: hay un problema menor con eso: no se sabe qué hay en el espacio de nombres 'std'; puede variar y varía entre implementaciones. Puede hacer que algo funcione bien durante un período de tiempo arbitrario y luego dejar de trabajar en un compilador diferente (versión de a). Es cierto que en * este * caso, donde el * único * nombre que estás definiendo es 'main', no hay mucho que pueda salir mal, pero cuando/si haces algo más que eso, es una historia completamente diferente. –

17

Es necesario utilizar "std :: endl;" - toda la biblioteca estándar está en el espacio de nombres std. También parece que usaste gcc en lugar de g++ en la línea de comando. Este último realiza automáticamente los pasos necesarios para vincular C++ correctamente.

+0

¡Gracias a usted! Todo funciona ahora ¡Gracias por ayudar a un novato total como yo! – Patof

+1

Estoy empezando a aprender C++, todo lo que puedo decir es: Wow, no sabía que había una diferencia entre GCC y G ++ (duh), me salvó la vida. Gracias hombre. – DarkMantis

7

endl; cae bajo el espacio de nombres std

sus 2 opciones son las siguientes:

1) declarar su espacio de nombres, por ejemplo,

#include <iostream> 
using namespace std; 

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

o usando std::endl; p. Ej.

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

Vea cuál le conviene. Recomiendo 1) (Compruebe que no hice std::cout porque ya he declarado mi espacio de nombres), ya que ayuda a reducir el tipeo std:: cada vez.