Je me suis récemment lancé dans la programmation et j'ai décidé d'apprendre le C ++. J'ai profité de la vente sur Udemy et j'y ai acheté trois cours, un pour les débutants en C ++, un pour la création de jeux et un pour Blender.
J'ai commencé à faire le cours pour les débutants, le conférencier a dit qu'il utiliserait Code :: Blocks mais que tout autre IDE ferait l'affaire, j'ai donc téléchargé Visual Studio 2017 car c'est ce que le cours de création de jeux utilisait. Mais quand je fais exactement ce que le conférencier dit (et écrit), le code ne se compilera pas correctement.
Voici un exemple:
Ce que le conférencier a écrit et sur lequel il a travaillé son ordinateur
#include <pch.h>
#include <iostream>
using std::cout;
int main()
{
cout << "Hello world! :-)";
}
Ce que j'ai pensé fonctionnerait après quelques recherches sur Google
#include <iostream>
using namespace std;
main()
{
cout << "Hello world! :-)";
}
Et ma question à ceux qui sont expérimentés est : Quelle est la différence entre Code :: Blocks et Visual Studio 2017? Qu'est-ce qui est différent dans ce cas? Est-ce que je pourrai même utiliser ce cours pour apprendre?
Merci d'avance!
edit: modifié dans un # manquant dans le code du professeur
3 Réponses :
L'utilisation de Visual Studio devrait être acceptable tant que vous désactivez les en-têtes précompilés et que votre didacticiel utilise du code conforme à la norme.
À propos des en-têtes précompilés:
Visual Studio active les en-têtes précompilés par défaut dans un programme de ligne de commande C ++. Cela signifie que dans votre projet, cela vous obligera par défaut à utiliser un en-tête précompilé dans la première ligne de votre code source (pch.h ici). En les désactivant, vous pouvez presque * faire fonctionner le premier extrait de code dans VS. Pour ce faire, sélectionnez votre projet, allez dans le menu «Projet-> Propriétés», puis dans la section «Propriétés de configuration -> C / C ++ -> En-têtes précompilés», puis changez le paramètre «En-tête précompilé» en «Ne pas utiliser précompilé Headers "option (cela s'applique à VS 2012, l'appliquer à d'autres versions de VS devrait être facile).
Si vous souhaitez éviter cela à l'avenir, vous pouvez créer un projet vide lors de la configuration de votre projet dans VS.
Voir aussi: http: // msdn.microsoft.com/en-us/library/h9x39eaw%28v=vs.71%29.aspx , Comment éviter les en-têtes précompilés
*: Le premier extrait de code ne fonctionnera pas réellement car la déclaration de main n'est pas correcte C ++, seulement C (voir https://en.cppreference.com/w/cpp/language/main_function , Quelle est la bonne déclaration de main? )
#include :
Voir la réponse de Gabriel.
inclure vs #include :
Le premier est tout à fait faux. Il doit être #include avec le #.
en utilisant l'espace de noms std; vs en utilisant std :: cout; :
Bien qu'aucune des deux ne soit particulièrement bonne, les deux devraient faire la même chose ici. Si vous n'écrivez ni l'un ni l'autre, vous devrez écrire std :: cout << ... au lieu de seulement cout << ... - cela semble ennuyeux mais c'est quelque chose auquel vous devriez vous habituer si vous voulez devenir un programmeur C ++ sérieux. Voir aussi Pourquoi "utiliser namespace std" est-il considéré comme une mauvaise pratique? A >.
main () vs int main () :
Ce n'est pas quelque chose que Code :: Blocks devrait autoriser car ce n'est pas un C ++ correct. main doit toujours renvoyer int.
Dans l'ensemble, vous semblez avoir déjà rencontré un nombre malheureux de différences entre les environnements / compilateurs sur cet exemple de base. Cependant, ni votre cours ni VS2017 ne sont faux pour l'instant, je vous recommande donc de continuer à les utiliser. Si quelque chose que votre conférencier écrit ne fonctionne pas dans un environnement différent, c'est probablement une mauvaise idée d'écrire ce type de code en premier lieu. Et ils ont fait plusieurs erreurs dans cet exemple simple.
PS: je recommande fortement d'activer les avertissements, car ils peuvent vous dire quand vous faites quelque chose de mal d'une manière plus subtile. Il y a beaucoup d'erreurs (du genre "se tirer une balle dans le pied") que le compilateur n'est pas obligé de vous empêcher de faire, mais si vous demandez à être arrêté (en tenant compte des avertissements) cela aidera vous.
Pour répondre à votre question, VS conviendra parfaitement à votre cours, même si je reste perplexe face à la version originale de ce code du conférencier.
Cependant, il est vraiment utile de prendre le temps de comprendre ce que tous vos changements ont fait , et pourquoi ils ont résolu votre problème. Peut-être que vous l'avez déjà fait - ce n'est tout simplement pas l'impression que j'ai eue de la phrase
Ce que j'ai compris fonctionnerait après quelques recherches sur Google
si le piratage du code permet d’obtenir une solution, vous devez toujours essayer de comprendre pourquoi . Vous pouvez maintenant voir ce que vous avez changé, examiner l'erreur d'origine et essayer de comprendre pourquoi vos modifications l'ont corrigée. Si vous avez effectué plusieurs modifications, étaient-elles toutes vraiment nécessaires? Comprenez-vous ce qu'ils ont tous fait et pourquoi?
Si vous faites cela, vous pouvez résoudre le problème suivant plus rapidement , plutôt que de recommencer le processus d’essais et d’erreurs. Vous pouvez même écrire un meilleur code qui évite le problème en premier lieu.
C'est la partie qui constitue réellement l'apprentissage, c'est pourquoi je m'efforce d'y remédier.
Le correctif important était de changer les lignes
std::cout << "Hello world! :-)";
en
using std::cout;
car le les anciens ne sont pas légaux en C ++. Si votre conférencier a vraiment écrit exactement cela et que vous n'avez pas mal copié, alors je n'ai aucune idée de la raison pour laquelle leur exemple a fonctionné.
Le contenu spécifique à Visual Studio est l'en-tête précompilé, comme décrit dans la réponse de Gabriel .
Mais le changement restant est essentiellement cosmétique. Remplacer:
using namespace std;
par
#include <iostream> int main()
N'affecte rien dans votre code, et simplement en utilisant
XXX
(sans utiliser du tout) fonctionnerait aussi bien.
Il est sûr de supposer qu'il s'agissait plus que de "permutations de code aléatoires". En fait, je parie que l'un des messages d'erreur ( utilisation de l'identifiant non déclaré 'cout' ) qui a été recherché sur Google à un moment donné a conduit à une réponse du type "vous avez oublié d'utiliser std :: cout ". Je trouve le dernier paragraphe inutilement condescendant, d'autant plus qu'ils ont déjà réussi à corriger toutes ces erreurs sans plus d'un changement accidentel.
Le problème si cela signifie que si vous introduisez des changements accidentels, cela signifie que vous ne savez pas quels changements étaient importants, ce qui signifie que vous ne savez pas pourquoi ils ont fonctionné ou comment éviter le problème à l'avenir.
Le point clé n'est pas que vous ne devriez jamais pirater quelque chose tant que cela ne fonctionne pas - vous ne pouvez ni apprendre ni maintenir votre motivation dans le vide - mais que vous devez apprendre à lire le message d'erreur, et lorsque votre code fonctionne enfin, il est très utile de s'asseoir et de comprendre pourquoi .
Tout cela est vrai, mais vous en déduisez actuellement que le demandeur n'a rien fait de tout cela, simplement parce qu'il n'a pas annulé ce changement. Ils ont probablement réalisé que les deux using s étaient équivalents dans le processus de compilation du code (parce que le changement n'a pas changé le message d'erreur), à quel point il est plus simple de le laisser là que de le retourner - et pourquoi gaspilleriez-vous l'effort s'il vous reste 3 autres messages de compilateur à vous soucier? Je ne pense pas que la réprimande (c'est ce que je ressens pour moi en tant que tiers non lié) est appropriée ici.
Peut-être! Je lis peut-être trop dans la phrase ce que j'ai pensé fonctionnerait après quelques recherches sur Google , mais c'est ainsi que cela me ressort. La question ne suggère au moins aucune compréhension particulière de ce que signifient les changements. Quoi qu'il en soit, ce n'est pas pour gronder, mais pour renforcer l'habitude d'essayer de comprendre.
Votre professeur a écrit du code C ++, en utilisant Visual Studio et la syntaxe, vous avez en fait écrit du code Visual C ++. Vous utilisez un compilateur complètement différent de celui de votre professeur. Vous devez configurer Visual Studio pour utiliser le même compilateur C ++, je dois le souligner, Visual Studio prend en charge plusieurs versions différentes de la norme C ++, il doit donc absolument fonctionner avec le premier bloc de code. Cependant, les questions qui demandent si vous serez en mesure d'utiliser ce cours, ne sont pas de notre portée. Personne ne peut répondre à ce sujet dans aucune communauté Stack Exchange et certainement pas ici chez Super User.
En-têtes précompilés
Si vous souhaitez écrire une application console standard dans VS2017, utilisez Créer un nouveau projet -> Visual C ++ -> Windows Desktop -> Windows Desktop Wizzard, puis assurez-vous qu'il est indiqué Application console dans le type d'application et décochez En-têtes précompilés et cycle de vie du développement de la sécurité et faites vérifier le projet vide.
@ FrançoisAndrieux: Déclarer une fonction sans type de retour n'a jamais été valide en C ++, mais c'est en C89 valide.
@You Oups, je n'ai pas remarqué cela.
Normalement, j'utiliserais "" pour les en-têtes de la solution ou du projet et <> pour les en-têtes système ou externes, donc #include serait #include "pch.h". Cela dit, l'un ou l'autre fonctionnera dans VS.