Estoy haciendo un curso, pero las cosas que dice el profesor no funcionan

3

Recientemente me metí en la programación y decidí aprender C ++. Aproveché la venta en Udemy y compré tres cursos allí, uno para principiantes en C ++, uno para hacer juegos y otro para Blender.

Comencé a hacer el curso para principiantes, el profesor dijo que usaría Code :: Blocks pero que cualquier otro IDE estaría bien, así que descargué Visual Studio 2017 porque eso era lo que usaba el curso de creación de juegos. Pero cuando hago exactamente lo que dice el profesor (y escribe), el código no se compilará correctamente.

Aquí hay un ejemplo:

Lo que el profesor escribió y se puso a trabajar en su computadora

#include <iostream> 

using namespace std;

main()
{
    cout << "Hello world! :-)";

}

Lo que descubrí funcionaría después de buscar en Google

#include <pch.h>
#include <iostream>
using std::cout;

int main()
{
    cout << "Hello world! :-)";
}

Y mi pregunta para quienes tienen experiencia es: ¿Cuál es la diferencia entre Code :: Blocks y Visual Studio 2017? ¿Qué es diferente en ese caso? ¿Podré usar este curso para aprender?

¡Gracias por adelantado!

editar: editado en un # faltante en el código del profesor

Wilmer Jonsson
fuente
Su profesor escribió código C ++, al usar Visual Studio y la sintaxis, en realidad usted escribió código Visual C ++. Estás utilizando un compilador completamente diferente a tu profesor. Debe configurar Visual Studio para usar el mismo compilador de C ++, debo señalar, Visual Studio admite varias versiones diferentes del estándar C ++, por lo que absolutamente debería funcionar con el primer bloque de código. Sin embargo, las preguntas que le preguntan si podrá utilizar este curso no están dentro de nuestro alcance. No es algo que nadie pueda responder en ninguna comunidad de Stack Exchange y ciertamente no aquí en Super User.
Sabueso de seguridad
3
Encabezados precompilados
Igor Tandetnik
Si desea escribir una aplicación de consola normal en VS2017, use Crear nuevo proyecto -> Visual C ++ -> Escritorio de Windows -> Windows Desktop Wizzard y luego asegúrese de que dice Aplicación de consola en el Tipo de aplicación y desmarque Encabezados precompilados y Ciclo de vida de desarrollo de seguridad y haga comprobar proyecto vacío
NathanOliver
3
@ FrançoisAndrieux: Declarar una función sin tipo de retorno nunca ha sido válido C ++, pero es válido C89.
Usted
1
Normalmente usaría "" para encabezados en la solución o proyecto y <> para encabezados externos o del sistema, por lo que #include <pch.h> sería #include "pch.h". Dicho esto, de cualquier manera funcionará en VS.
drescherjm

Respuestas:

4
  • #include <pch.h>:
    Ver la respuesta de Gabriel.

  • include <iostream>vs #include <iostream>:
    El primero es simplemente incorrecto. Tiene que estar #includecon el #.

  • using namespace std;vs using std::cout;:
    Si bien ninguno de los dos es una práctica especialmente buena, ambos deberían hacer lo mismo aquí. Si no escribe ninguno de ellos, tendrá que escribir en std::cout << ...lugar de solo cout << ...: eso parece molesto, pero es algo a lo que debe acostumbrarse si finalmente desea ser un programador serio de C ++. Consulte también ¿Por qué "usar el espacio de nombres estándar" se considera una mala práctica? .

  • main()vs int main():
    Esto no es algo que Code :: Blocks debería permitir porque no es correcto C ++. mainsiempre debe devolver int.

En general, parece que ya ha encontrado un desafortunado número de diferencias entre entornos / compiladores en este ejemplo básico. Sin embargo, ni su curso ni VS2017 están mal hasta ahora, por lo que le recomiendo que siga usándolos. Si algo para lo que escribe su profesor no funcionará en un entorno diferente, probablemente sea una mala idea escribir ese tipo de código en primer lugar. Y cometieron varios errores en este simple ejemplo.

PD: Recomiendo encarecidamente habilitar las advertencias, porque pueden decirte cuándo haces algo mal de una manera más sutil. Hay muchos errores (del tipo "disparándose en el pie") que el compilador no está obligado a evitar que cometas, pero si pides que te detengan (prestando atención a las advertencias) te ayudará.

Max Langhof
fuente
3

El uso de Visual Studio debería estar bien siempre que deshabilite los encabezados precompilados y su tutorial use código compatible con el estándar.

Acerca de los encabezados precompilados:

Visual Studio habilita encabezados precompilados de forma predeterminada en un programa de línea de comandos C ++. Esto significa que en su proyecto, por defecto, lo obligará a usar un encabezado precompilado en la primera línea de su código fuente (pch.h aquí). Al deshabilitarlos, casi * puede hacer que el primer fragmento funcione en VS. Para hacer esto, seleccione su proyecto, vaya al menú "Proyecto-> Propiedades", luego a la sección "Propiedades de configuración -> C / C ++ -> Encabezados precompilados", luego cambie la configuración "Encabezado precompilado" a "No usar precompilado" Opción de encabezados "(esto se aplica a VS 2012, aplicar esto a otras versiones de VS debería ser fácil).

Si desea evitar esto en el futuro, puede crear un proyecto vacío al configurar su proyecto en VS.

Ver también: http://msdn.microsoft.com/en-us/library/h9x39eaw%28v=vs.71%29.aspx , Cómo evitar encabezados precompilados

*: El primer fragmento no funcionará realmente ya que la declaración de main no es correcta C ++, solo C (consulte https://en.cppreference.com/w/cpp/language/main_function , ¿Cuál es la declaración de main adecuada? )

Gabriel Ravier
fuente
3

Para su pregunta real, VS estará bien para su curso, aunque todavía estoy desconcertado por la versión original de este código del profesor.

Sin embargo, es realmente útil tomarse el tiempo para comprender qué hicieron todos sus cambios y por qué solucionaron su problema. Tal vez ya hiciste esto, esa no es la impresión que obtuve de la frase

Lo que descubrí funcionaría después de buscar en Google

  • cuando reciba un error o advertencia de compilación, léalo e intente comprenderlo.
  • si no comprende el error, y esto es normal, ciertamente mientras aprende, entonces piratear el código hasta que funcione está perfectamente bien. Al menos a veces es más rápido, y saber que progresaste es su propia recompensa.
  • Si piratear el código con Internet a su disposición no obtiene una solución, solo tendrá que estudiar más el mensaje de error. Activar todos los errores y advertencias del compilador y probar varios compiladores pueden ser útiles, incluso si todos fallan, los mensajes podrían ser más útiles. (A menudo encuentro que clang tiene errores útiles, y godbolt.org es muy útil).
  • Si hackear el código tiene una solución, aún debe intentar entender por qué . Ahora puede ver lo que ha cambiado, ver el error original e intentar comprender por qué sus cambios lo arreglaron. Si realizó múltiples cambios, ¿fueron todos realmente necesarios? ¿Entiendes lo que hicieron todos y por qué?

    Si hace esto, puede solucionar el siguiente problema relacionado más rápido , en lugar de pasar por todo el proceso de prueba y error nuevamente. Incluso puede escribir un código mejor que evite el problema en primer lugar.

    Esta es la parte que en realidad constituye el aprendizaje, y es por eso que estoy tratando de abordarlo.


La solución importante fue cambiar las líneas.

include <iostream>

main()

a

#include <iostream>

int main()

porque los primeros no son legales en C ++. Si su profesor realmente escribió exactamente eso y de alguna manera no copió mal, entonces no tengo idea de por qué su ejemplo funcionó.

El material específico de Visual Studio es el encabezado precompilado, como se describe en la respuesta de Gabriel.

Pero el cambio restante es esencialmente cosmético. Sustitución:

using namespace std;

con

using std::cout;

No afecta nada en su código, y solo usa

  std::cout << "Hello world! :-)";

(sin ninguno using) funcionaría igual de bien.

Inútil
fuente
Es seguro asumir que estos fueron más que "permutaciones de código aleatorio". De hecho, apostaría a que uno de los mensajes de error ( use of undeclared identifier 'cout') que se buscó en Google en algún momento condujo a una respuesta similar a "olvidaste using std::cout". Me parece que el último párrafo innecesariamente condescendiente, sobre todo teniendo en cuenta lo que ya tenían logran corregir todos estos errores con no más de un cambio imprevisto.
Max Langhof
El problema es que si está introduciendo cambios incidentales, eso significa que no sabe qué cambios fueron importantes, lo que significa que no sabe por qué funcionaron o cómo evitar el problema en el futuro.
Inútil
El punto clave no es que nunca debas hackear algo hasta que funcione, no puedes aprender o mantener tu motivación en el vacío, sino que debes aprender a leer el mensaje de error y cuando tu código finalmente funcione, Es muy útil sentarse y comprender por qué .
Inútil
Todo eso es cierto, pero actualmente infieres que el autor de la pregunta no hizo nada de eso, simplemente porque no revirtió ese cambio. Probablemente se dieron cuenta de que los dos usings eran equivalentes en el proceso de compilación del código (porque el cambio no cambió el mensaje de error), en ese momento es más simple dejarlo allí que revertirlo, y por qué desperdiciarlo ¿el esfuerzo si te quedan otros 3 mensajes de compilación de los que preocuparte? No creo que el regaño (eso es lo que me parece como un tercero no relacionado) sea apropiado aquí.
Max Langhof
¡Posiblemente! Puede que esté leyendo demasiado la frase que pensé que funcionaría después de buscar en Google , pero así es como se me ocurre. La pregunta no sugiere ninguna comprensión particular de lo que significan los cambios, al menos. De todos modos, no está destinado a regañar, sino a reforzar el hábito de tratar de entender.
Inútil