¿Cómo mantener abierta la ventana de la consola en Visual C++?


Estoy empezando en Visual C++ y me gustaría saber cómo mantener la ventana de la consola.

Por ejemplo, esta sería una aplicación típica de "hola mundo":

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

¿Cuál es la línea que me falta?

Author: Jonathan Leffler, 2009-01-18

20 answers

Comience el proyecto con Ctrl+F5en lugar de solo F5.

La ventana de la consola permanecerá abierta con el mensaje Press any key to continue . . . después de que el programa salga.

Tenga en cuenta que esto requiere la opción enlazador Console (/SUBSYSTEM:CONSOLE), que puede habilitar de la siguiente manera:

  1. Abra su proyecto y vaya al Explorador de soluciones. Si me estás siguiendo en K & R, tu "Solución" será 'hola' con 1 proyecto debajo, también 'hola' en negrita.
  2. Haga clic derecho en 'hola" (o como sea el nombre de tu proyecto.)
  3. Elija "Propiedades" en el menú contextual.
  4. Elija Propiedades de configuración>Enlazador>Sistema.
  5. Para la propiedad "Subsistema" en el panel derecho, haga clic en el cuadro desplegable en la columna de la derecha.
  6. Elija " Consola (/SUBSISTEMA:CONSOLA)"
  7. Haga clic en Aplicar, espere a que termine de hacer lo que haga, luego haga clic en Aceptar. (Si "Aplicar" está en gris, elija alguna otra opción de subsistema, haga clic en Aplicar y, a continuación, volver y aplique la opción consola. Mi experiencia es que aceptar por sí solo no funcionará.)

CTRL-F5 y las sugerencias del subsistema funcionan juntas; no son opciones separadas.

(Cortesía de DJMorreTX de http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6)

 357
Author: Zoidberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 19:25:11

La forma estándar es cin.get() antes de su declaración de devolución.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}
 41
Author: Gordon Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 05:04:06

Ponga un punto de interrupción en la línea return.

Lo estás ejecutando en el depurador, ¿verdad?

 22
Author: Sam Harwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-20 10:57:11

Otra opción es usar

#include <process.h>
system("pause");

Aunque esto no es muy portátil porque solo funcionará en Windows, pero se imprimirá automáticamente

Presione cualquier tecla para continuar...

 18
Author: Marcos Marin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-29 15:17:25

Para los proyectos makefile, la solución aceptada falla, debido a un error en Visual Studio (que está presente al menos hasta la versión 2012 - aún no he probado 2013). Este error se detalla aquí.

Para hacer una pausa en la consola después de la terminación del programa en un proyecto makefile, realice estos pasos (esto puede diferir para versiones distintas a 2010 - 2012):

1) Pasar /SUBSYSTEM:CONSOLE al enlazador. - EDITAR : ver abajo.

2) Abra su archivo de proyecto (.vcxproj) en un editor de texto.

3) Dentro de la etiqueta raíz <project>, inserte lo siguiente:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) Vuelva a cargar el proyecto en su solución.

5) Ejecute el programa sin depurar (CTRL + F5).

EDITAR:

Según mi comentario a continuación, establecer la opción de enlazador /SUBSYSTEM:CONSOLE es en realidad irrelevante para proyectos makefile (y no necesariamente posible, si está utilizando un compilador que no sea MSVC). Todo lo que importa es que la configuración se agrega a el .archivo vcxproj, según el paso 3 anterior.

 7
Author: JBentley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 01:24:41

Puede usar cin.get(); o cin.ignore(); justo antes de su declaración de retorno para evitar que la ventana de la consola se cierre.

 4
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 05:05:49

Simplemente agregue un punto de interrupción al corchete de cierre de su método _tmain. Esta es la forma más fácil, además de que no tiene que agregar código para depurar.

 3
Author: Odys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-25 16:44:15

Simplemente ponga un punto de interrupción en el último corchete rizado de main.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

Funciona para mí, no hay necesidad de ejecutar sin depurar. También ejecuta destructores antes de golpear el punto de interrupción para que pueda verificar cualquier mensaje impreso en estos destructores si tiene alguno.

 3
Author: Juan Castano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-07 04:12:09

Coloque un punto de interrupción en la llave final de main(). Se disparará incluso con múltiples sentencias return. El único inconveniente es que una llamada a exit() no será capturada.

Si no está depurando, siga los consejos de la respuesta de Zoidberg e inicie su programa con Ctrl+F5 en lugar de solo F5.

 2
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-30 23:40:16

Cin.get (), o system ("PAUSE"). No he oído que puedas usar return(0);

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-30 19:41:16

Incluyo #include <conio.h> y luego, agrego getch(); justo antes de la línea return 0;. Eso es lo que aprendí en la escuela de todos modos. Los métodos mencionados aquí son bastante diferentes.

 1
Author: Amruth Pillai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-30 06:51:15

Tenía el mismo problema . Estoy usando _getch () justo antes de la sentencia return. Funciona.

 1
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 13:48:41

Tuve el mismo problema; En mi aplicación hay múltiples puntos exit() y no había forma de saber exactamente dónde sale, entonces me enteré de esto:

atexit(system("pause"));

O

atexit(cin.get());

De esta manera se detendrá sin importar dónde salgamos en el programa.

 1
Author: Charaf Errachidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-25 14:29:03

Mis 2 centavos:

Opción 1: Añadir un punto de interrupción al final de main()

Opción 2: Añadir este código, justo antes del return 0;:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Deberá incluir <iomanip> para std::numeric_limits

 1
Author: Arnav Borborah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 23:40:17

(Algunas opciones pueden ser llamadas por diferentes nombres. No uso la versión en inglés)

Tuve el mismo problema, cuando creé proyectos con la opción "proyecto vacío", Crear proyecto como "Win32-console application" en lugar de "proyecto vacío" . En el cuadro de diálogo que aparece ahora, presione " continuar "y después de eso puede marcar la opción" proyecto vacío " y presione confirmar. Después de esto CTRL + F5 abrirá una consola que no se cierra automáticamente.

 0
Author: Blechdose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 19:15:57

Puedes poner keep_window_open (); antes de la vuelta aquí hay un ejemplo

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}
 0
Author: Sifis Babionitakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-24 16:59:47

Otra opción:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

En general:

int main(int argc, char* argv[]) {
    MAINRET;
}
 0
Author: chen_767,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-15 06:58:07

Simplemente agregue system ("pause") al final del código antes de devolver 0 de esta manera

int main()
{
some code goes here
system("pause")
return 0;
}
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-13 23:55:09

En realidad, la solución real es la selección de la plantilla del proyecto en sí. Debe seleccionar la aplicación de consola Win32 en VS anterior, o completar el nombre del proyecto primero y luego hacer doble clic en Windows Desktop wizard y luego seleccionar la aplicación de consola Win32. A continuación, seleccione proyecto vacío en este punto. Esto entonces permite lo que el interrogador original realmente quería sin agregar un punto de detención adicional y un código de retención. Yo también pasé por este problema. La respuesta también está en el sitio de MSDN.

 0
Author: user9416431,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-27 02:55:47

Aquí hay una manera de mantener la ventana de comandos abierta independientemente de cómo se detiene la ejecución sin modificar ningún código:

En Visual Studio, abra Las Páginas de Propiedades del Proyecto -> Depuración .

Para Comando , ingrese $(ComSpec)

Para Argumentos de comando, ingrese /k $(TargetPath). Agregue cualquier argumento a su propia aplicación.

Ahora F5 o Ctrl-F5 ejecuta Windows/System32/cmd.exe en una nueva ventana, y /k asegura que el el símbolo del sistema permanece abierto después de que se complete la ejecución.

El inconveniente es que la ejecución no se detiene en los puntos de interrupción.

 0
Author: Jonathan Lidbeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 16:38:55