Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ivancea96 en 2 Julio 2013, 01:44 AM

Título: Duda sobre portabilidad
Publicado por: ivancea96 en 2 Julio 2013, 01:44 AM
Yo programo C++ en Windows 7. Programo en consola, principalmente porque no se mucho visual ni de API's xD

La duda es...
Si, programando en consola, cambio los -system("cls");- y -system("pause");- (supongo que una mala costumbre mía), y pongo comandos de la librería estandar, ¿sería portable a otros Windows, Unix, Apple, y diversos sistemas?

EDITO: Busco la forma de borrar la pantalla de consola sin usar system("cls"), clrscr(), ni escribir 100 saltos de linea.
Título: Re: Duda sobre portabilidad
Publicado por: amchacon en 2 Julio 2013, 02:22 AM
Cualquier función de la estándar es portable a cualquier sistema.

cin.get(); es un sustituto de pause. De limpiar no conozco ninguno, aunque puedes utilizar Compilación Condicional.
Título: Re: Duda sobre portabilidad
Publicado por: ivancea96 en 2 Julio 2013, 02:41 AM
Mm gracias amchacon. Echaré un vistazo a la compilación condicional.
Mejor dicho, buscaré alguna guia sobre eso, tengo que echarle un vistazo a fondo, que nunca me paré mucho. xD
Título: Re: Duda sobre portabilidad
Publicado por: amchacon en 2 Julio 2013, 02:52 AM
Está tirado:

Código (cpp) [Seleccionar]
void LimpiarPantalla()
{
   #ifdef _WIN32
   system("CLS");
   #else
   system("clear");
   #endif
}


Esto se interpetra así: "Sí estás en una plataforma Windows, compila este código, si no lo estás compila este otro".

Puedes ver los #define de los distintos sistemas operativos aquí:
http://sourceforge.net/p/predef/wiki/OperatingSystems/

Aunque nada te impide a crearte los tuyos propios:
Código (cpp) [Seleccionar]
#define WINDOWS

void LimpiarPantalla()
{
   #ifdef WINDOWS
   system("CLS");
   #else
   system("clear");
   #endif
}


Cuando no estemos en Windows, quitamos el define y ya está.

O bien, en vez de poner el #define en el código nos vamos a project -> build options -> #defines y ponemos: WINDOWS.

Puede ser incluso más interesante crear dos opciones de construcción: Release Windows y Release Linux. En cada una ponemos nuestro #define correspondiente.
Título: Re: Duda sobre portabilidad
Publicado por: eferion en 2 Julio 2013, 08:36 AM
O bien, si eres más purista y no te gustan los condicionales del compilador en medio del código:

Código (cpp) [Seleccionar]

#ifdef _WIN32
char* limpiar_pantalla_cmd = "CLS";
#else
char* limpiar_pantalla_cmd = "clear";
#endif

void func( )
{

  // ...

  system( limpiar_pantalla_cmd );

  // ...

}
Título: Re: Duda sobre portabilidad
Publicado por: ivancea96 en 2 Julio 2013, 15:50 PM
Muchas gracias amchacon, creo que eso venía a ser lo que buscaba.
Eferion, gracias también, ya que tengo varios system("cls"), y ayudará bastante.