Estandares en C++ y g++ - ¿Problema al compilar?

Buenas gente! Pues buscando un equivalente de system("pause"); para linux por google como unica solucion me he encontrado el siguiente fragmento de programa:

#include <iostream>

int main(void)
{
    cout << "Hola Mundo!" << endl;
    cout << "Presione cualquier tecla para continuar..." << endl;
    getchar();
    return 0;
}


Bien, novato de mi le he ido a meter al iostream un .h que tan habitual se me ha vuelto. Tras intentar compilarlo unas cuantas veces como gili***** con el gcc me acuerdo que solo compilaba "c" a palo seco [+risas] .

Bueno, la cosa es que compilo con g++ y me escupe lo siguiente:

g++ escribió:In file included from /usr/lib/gcc/i686-pc-linux-gnu/3.4.4/include/g++-v3/backward/iostream.h:31,
from system_pause.cpp:1:
/usr/lib/gcc/i686-pc-linux-gnu/3.4.4/include/g++-v3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated.


Y digo, bueno, pues por mi vale, le quitamos el .h al iostream pero.....

g++ compilando con iostream sin .h escribió:system_pause.cpp: In function `int main()':
system_pause.cpp:5: error: `cout' undeclared (first use this function)
system_pause.cpp:5: error: (Each undeclared identifier is reported only once for each function it appears in.)
system_pause.cpp:5: error: `endl' undeclared (first use this function)


Bonito error [+risas] . Pues por mas que miro no veo por que si me dice que el estandar es no me compila y si cuando tiene .

Se que es una tonteria de error por que con el .h me compila bien, pero ya que estoy aprendiendo "a programar" al menos quiero hacerlo bien.

La info de mi g++ por si sirve de algo (esta algo anticuadillo):

dani@Gentoo ~/pruebas_c $ g++ -v
Reading specs from /usr/lib/gcc/i686-pc-linux-gnu/3.4.4/specs
Configured with: /var/tmp/portage/gcc-3.4.4-r1/work/gcc-3.4.4/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/3.4.4 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.4/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.4 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.4/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.4/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.4/include/g++-v3 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --disable-libunwind-exceptions --disable-multilib --disable-libgcj --enable-languages=c,c++,f77 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Thread model: posix
gcc version 3.4.4 (Gentoo 3.4.4-r1, ssp-3.4.4-1.0, pie-8.7.8)


A ver si alguien me podria decir el por que de mi fallo.

Muchas gracias por adelantado [oki]

Salu2!

PD: si alguien me dice un system("pause") menos chapucero tambien se lo agradeceria :P por que eso ha sido lo menos guarro que he visto.
std::cout, std::endl...
o
using namespace std;

y, por supuesto, sin .h ;-)
NeoRave escribió:std::cout, std::endl...
o
using namespace std;

y, por supuesto, sin .h ;-)


[boing] Me queda muuuuuuuuuucho por aprender [looco] Ni loco se me hubiese pasado por la cabeza que lo que estubiese mal fuese la funcion. Creo que me quedare con using std::cout; using std::endl en la cabecera del programa que es el modo mas "vago" :P

Muchas gracias por la ayuda!!! :)

Salu2 y muchas gracias!! ;)

PD: Como me imaginaba no me vale el fragmento de programa XD solo funciona al pulsar intro y no cualquier tecla :-|
Mmmm y usar el programa sleep con una llamada a la consola? Mmm fijo ke tiene ke haber alguna llamada para ke te pare el programa, por lo menos en el kernel hay :-?

saludetes
no me acuerdo ahora mismo a exactamente de la sintaxis pero si pones al final

system("Pause");


te sale automatico lo de presione una tecla para continuar y te ahorras de hacer la chapuza del getchar o cin (segun lo prefieras)
dykstra escribió:Mmmm y usar el programa sleep con una llamada a la consola? Mmm fijo ke tiene ke haber alguna llamada para ke te pare el programa, por lo menos en el kernel hay :-?

saludetes


Seguire buscando pero me da que me toca quedarme con la chapuza esa : / algo habra digo yo :P Lo que me dices no lo entiendo :S Si hago un sleep me hace una parada de X milisegundos. Como algo temporal podria valerme pausarlo tanto tiempo pero.... Si encuentro otra cosa alternativa lo dire :D

Teniente Dan escribió:no me acuerdo ahora mismo a exactamente de la sintaxis pero si pones al final

system("Pause");


te sale automatico lo de presione una tecla para continuar y te ahorras de hacer la chapuza del getchar o cin (segun lo prefieras)


Es lo que queria hacer, pero pause es solo de windows y yo lo quiero para linux :)

Salu2 y gracias!
¿y por qe no un getchar al teclado y santas pascuas ?.
Sertinell escribió:¿y por qe no un getchar al teclado y santas pascuas ?.


No entiendo que quieres decir :( El getchar asecas no pasa a la siguiente orden hasta que no pulsas un intro y lo que me gustaria hacer seria que fuese al pulsar cualquier tecla.

Salu2 y muchas gracias!
\-\adEs escribió:y lo que me gustaria hacer seria que fuese al pulsar cualquier tecla



has probado con cin.get(); ¿¿¿?¿
Teniente Dan escribió:has probado con cin.get(); ¿¿¿?¿


Acabo de probarlo y pasa como getchar normal, espera a que le introduzcas un intro :/ Gracias igualmente :)

Salu2!
Ups, perdón, entendí mal la pregunta.

Joder, a ver si consigo acordarme, no valía para eso la función getch o algo asín en windows? mmm ke cosas, demasiado tiempo sin programar... ke kabeza la mía.

PD: Por lo menos upeo el hilo [sati]
\-\adEs escribió:Creo que me quedare con using std::cout; using std::endl en la cabecera del programa que es el modo mas "vago" :P


Te has liado xD. Tienes dos opciones:

A)
#include

using namespace std; //usar "espacio de nombres" estandar

int main(){

cout <<"Hola soy coco" <
return 0;
}



B)
#include

int main(){

std::cout <<"Hola soy coco <<std::endl;

return 0;
}



Yo y el estandar de C++ te recomendamos que uses la opcion A XD Pero bueno tu tambien seguro que la hubieras cogido con el tiempo, porque te evitas andar fijandote en si has puesto o no std::xxx donde deberias.
Yo y el estandar de C++ te recomendamos que uses la opcion A


El estándar no lo recomienda. Por otro lado, la opción A no es adecuada ni recomendable. Rationale: "The C++ Programming Language" sección 8.2.9.1.

- ferdy

-----

Por otro lado la forma correcta de escribir Hola Mundo en C++ es:

#include <iostream>

int main(int, char**)
{
    std::cout << "Hello World!" << std::endl;

    return EXIT_SUCCESS;
}


- ferdy
s4ur0n escribió:Te has liado xD.


Es lo mas probable y posible [+risas] Yo habia visto esto y otra web que no encuentro por que lo que me dijo NeoRave pues entendi mas bien poco, asique busque a ver que salia con lo que me habia dado y debo de haber visto un ejemplo en el que se ponia eso en la cabecera del programa.

Seguire pues el consejo de Ferdy y cuando use c++ lo intentare hacer lo mas standar posible ^_^

Salu2 y muchas gracias!
Vaya, siento haberte liado. No me extendí mucho en mi respuesta, pero me parecía suficiente para que encontrases algo (de hecho lo hiciste) ;-)

Yo me refería a los ejemplos 2 y 3 del segundo post del hilo que enlazas.

Saludos
NeoRave escribió:Vaya, siento haberte liado. No me extendí mucho en mi respuesta, pero me parecía suficiente para que encontrases algo (de hecho lo hiciste) ;-)

Yo me refería a los ejemplos 2 y 3 del segundo post del hilo que enlazas.

Saludos


No tienes por que sentir nada. Siempre se agradece mas algo por lo que buscar que no la respuesta ya dada entera :D

Salu2!
Con respecto al getchar() ,la tecla intro y la aparente imposibilidad de leer un simple caracter.

Sin duda este es uno de los temas que mas irrita a los noveles C/C++ que intentan exportar sus programas de consola de güindows a unix/gnu-linux.

La librería 'std' (stdio.h) que yo sepa no permite esto, intimamente ligado a la configuración del terminal (o mas exactamente pseudoterminal) que antiguamente solían ser terminales por puerto serie, cosa que en güindows jamas se ha visto(yo si lo he visto !jajaja!), por lo que digamos que en unix/gnu-linux la cosa es mas complicada(ver comando 'stty').

La forma natural de resolver esto es usando las 'curses', pero para un novel(o incluso para un no-novel) es matar moscas a cañonazos.

#include
#include

EsperaTecla()
{
struct termios mt1,mt2;
tcgetattr(0,&mt1);
cfmakeraw ( &mt2 );
tcsetattr(0,TCSANOW,&mt2);
getchar();
tcsetattr(0,TCSANOW,&mt1);
}

Prueba esto.

Salud.
La solución es que stdin no sea 'buffered' y dejarse de leches :)

Cómo hacerlo en C o C++ queda como ejercicio para el lector.

- ferdy
Ferdy escribió:La solución es que stdin no sea 'buffered' y dejarse de leches :)


De nada te sirve hacer el stdin no 'buffered' si la interface que te entrega los datos es con con 'búfer de línea' , es decir que no te los entrega hasta que haya salto de linea.

Salud.
De nada te sirve hacer el stdin no 'buffered' si la interface que te entrega los datos es con con 'búfer de línea' , es decir que no te los entrega hasta que haya salto de linea.


*nod*
19 respuestas