Foro de elhacker.net

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
  1. void LimpiarPantalla()
  2. {
  3.    #ifdef _WIN32
  4.    system("CLS");
  5.    #else
  6.    system("clear");
  7.    #endif
  8. }

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
  1. #define WINDOWS
  2.  
  3. void LimpiarPantalla()
  4. {
  5.    #ifdef WINDOWS
  6.    system("CLS");
  7.    #else
  8.    system("clear");
  9.    #endif
  10. }

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
  1. #ifdef _WIN32
  2. char* limpiar_pantalla_cmd = "CLS";
  3. #else
  4. char* limpiar_pantalla_cmd = "clear";
  5. #endif
  6.  
  7. void func( )
  8. {
  9.  
  10.  // ...
  11.  
  12.  system( limpiar_pantalla_cmd );
  13.  
  14.  // ...
  15.  
  16. }


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.