Partage
  • Partager sur Facebook
  • Partager sur Twitter

Using namespace std ???

14 juin 2019 à 10:57:00

Bonjour à tous,

Au début du cours de CPP, il y a une chose que je n'ai pas bien comprise.

C'est "using namespace std;", je ne vois pas pourquoi cette ligne peut éviter tout conflit avec d'autres librairies ?

Merci à tout ceux qui me répondront !

  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 11:14:45

>il y a une chose que je n'ai pas bien comprise.

Et vous avez bien raison de vous poser ces questions.

Avoir un "using namespace std;" au début d'un .cpp (ou encore pire dans un .h), c'est le signe d'un code de très très mauvaise qualité.

Les "using namespace" ont été inventés, à la base, pour rendre du vieux code C++ compatible avec la version de 1998 du standard C++ (il y a aussi des usages plus intelligents qui se sont greffés près, mais le "using namespace std;" c'est vraiment juste pour ne pas retoucher à du vieux code tout tour pourri.

Donc non "using namespace std;", c'est pas pour éviter des conflits avec des librairies, comme l'indique les sagouins qui pratiquent encore cette rustine pour fait la transition d'IL Y A DÉJÀ PLUS DE 20 ANS, BORDEL.

C'est juste que ces neuneu n'ont pas compris comment fonctionne ce langage et qu'ils n'ont voulu reprendre leur code dégueulasse en plus de 20 ans !!!

Courage, et désolé, mais des vieilleries comme ça, il y en a tout plein le Web.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
14 juin 2019 à 11:36:54

bacelar a écrit:

>il y a une chose que je n'ai pas bien comprise.

Et vous avez bien raison de vous poser ces questions.

Avoir un "using namespace std;" au début d'un .cpp (ou encore pire dans un .h), c'est le signe d'un code de très très mauvaise qualité.

Les "using namespace" ont été inventés, à la base, pour rendre du vieux code C++ compatible avec la version de 1998 du standard C++ (il y a aussi des usages plus intelligents qui se sont greffés près, mais le "using namespace std;" c'est vraiment juste pour ne pas retoucher à du vieux code tout tour pourri.

Donc non "using namespace std;", c'est pas pour éviter des conflits avec des librairies, comme l'indique les sagouins qui pratiquent encore cette rustine pour fait la transition d'IL Y A DÉJÀ PLUS DE 20 ANS, BORDEL.

C'est juste que ces neuneu n'ont pas compris comment fonctionne ce langage et qu'ils n'ont voulu reprendre leur code dégueulasse en plus de 20 ans !!!

Courage, et désolé, mais des vieilleries comme ça, il y en a tout plein le Web.


Et bien merci beaucoup pour ta réponse, je serais plus vigilent dorénavent ;)

Donc serait-ce utile de continuer le cours de OCS sur le CPP ? ou non ?

-
Edité par ArthurMariet 14 juin 2019 à 11:37:49

  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 11:56:22

>Donc serait-ce utile de continuer le cours de OCS sur le CPP ? ou non ?

Le cours d'OCS sur le C++ est une calamité.

Je te laisse regarder sur ce même forum les réponses à ce sujet qui te donneront des liens vers des cours bien meilleurs (zeste de savoir, gbdivers http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c, etc...)

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
14 juin 2019 à 12:17:54

bacelar a écrit:

>il y a une chose que je n'ai pas bien comprise.

Avoir un "using namespace std;" au début d'un .cpp (ou encore pire dans un .h), c'est le signe d'un code de très très mauvaise qualité.

C'est en effet une mauvaise chose dans du code qui se voudrait de qualité professionnelle.

Maintenant, quand on enseigne à des débutants, on n'a pas la prétention d'inculquer de suite des normes professionnelles (*) à des gens qui ne savent strictement rien faire et ne connaissent rien à la base de la base.

(*) Utiliser des exceptions pour le traitement des anomalies ? Ecrire du code générique ? Employer la bibliothèque standard autant que possible ?

  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 13:57:47

Indiquer que des trucs sont bien rangés des jolies petites boites étiquetées par thèmes (les namespaces et des classes), c'est pas plus facile que de sortir des "out" et des "in" de nulle part ???
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
14 juin 2019 à 18:34:51

Quand tu commences en C++, tu as une idée du nombre de choses qui sortent de nulle part ?

Par exemple, tu prend le hello world classique, et (défi) tu nous fais un commentaire expliquant TOUT ce qui ne doit pas sortir de nulle part et que tu ne veux pas cacher dans un premier temps.

Par exemple ce que c'est un namespace, pourquoi il faut les utiliser - attention : tu expliques à des gens qui ne savent pas ce qu'est un module ils n'ont jamais écrit de code, alors les problématiques de collisions de nommage, il va falloir détailler - et d'où sort ce std, etc. C'est quoi include ? Pourquoi on fait des include si c'est standard ? et <<, ça veut dire quoi ? Et pourquoi il y a un # devant ?

Et pourquoi c'est pas std::main et std::include et std::operator<<?

Et après le std::out << ..., tu ne vérifies pas si ça a réussi ? :-)

-
Edité par michelbillaud 14 juin 2019 à 18:40:38

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2019 à 10:42:45

Pas besoin de parler de collision de nom, et le reste, using namespace ou pas il faut l'aborder.

Et expliquer qu'il y a une méthode de rangement en boites, c'est plus simple et moins arbitraire que "mettez un using namespace xxx, on verra plus tard". Non ?

Les questions que se poseront les apprenants, bin, on n'a pas les même avec un "using namespace xxx" ?

Moi, je pense pas que using bidule soit plus explicite que de dire qu'il y a un système d'arborescence, comme dans un système de fichier.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
17 juin 2019 à 11:10:23

bacelar a écrit:

Les questions que se poseront les apprenants, bin, on n'a pas les même avec un "using namespace xxx" ?

Pas au même moment.

Il y a un truc fondamental dans l'enseignement aux débutants : ils ne peuvent absolument pas tout comprendre du premier coup, parce que tout a des tenants et des aboutissants.

Ton histoire de namespace, ce n'est utile que quand on sait qu'un programme peut faire appel à des bibliothèques, qui regroupent des fonctions, qui peuvent eventuellement s'appeler pareil mais ne font pas la même chose. Tu veux expliquer ça à des gens qui ne savent même pas encore ce qu'est une fonction ?

Donc il y a un apprentissage en spirale (comme quand tu commences à programmer avec un langage/un environnement que tu ne maitrises évidemment pas) : tu pars d'exemples que tu comprends partiellement, et tu fais des trucs avec sans évidemment avoir tout éclairci ni avoir la prétention de comprendre vraiment ce que tu fais. Donc il faut faire plusieurs tours, qui remettent en cause à chaque fois ce qu'on pensait savoir (la machine notionnelle comme on dit), et la manière dont on s'y est pris jusque là.

Quand tu es en train de montrer hello world, tu as le choix entre deux "explications" si tu ne veux pas passer 2 heures dessus

  • on met using namespace std pour utiliser les trucs standards,  et on verra après en détail ce que c'est
  • on met std:: devant cout  mais pas devant int ni devant include etc.  

La seconde façon de faire attire l'attention sur une énumération de cas particuliers. Ca induit une charge cognitive qui n'est pas souhaitaible à ce moment là : le moment où tu est déja en train de patiner pour expliquer que non, std::cout ou cout, ce n'est pas "afficher". Afficher, c'est l'action << quand elle est appliquée à (l'objet) cout qui est le flux de sortie,  et un argument.

-
Edité par michelbillaud 17 juin 2019 à 11:12:20

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2019 à 15:39:13

Salut,

Ben, l'un dans l'autre, pourquoi ne pas commencer le cours de C++ en disant qu'il s'agit d'un langage modulaire, et en expliquant ce que cela implique.

Car il ne faut pas se leurrer: la première ligne de code fera appel à cette fonction, même si le tout premier code que tu lui présentes est un hello world ;)

Donc, en t'assurant qu'ils ont compris cette notion de modularité, tu évites -- a priori -- une grande partie des question concernant la ligne

#include <iostream>

car il "te suffit" alors d'expliquer que c'est le mécanisme qui fourni au compilateur la connaissance d'une partie du module correspondant à la bibliothèque standard qui contient entre autres la notion de sortie standard (commune, en faite) que l'on utilisera plus loin.

Tant qu'à faire, et parce que c'est dans l'ordre des choses, tu pourrais d'ailleurs en profiter pour expliquer que cette sortie standard sera -- typiquement -- représentée par la console dans les exemples qui vont suivre, mais qu'elle pourrait tout aussi bien représenter "n'importe quel moyen d'envoyer des données vers l'extérieur".

A partir de là, pourquoi ne pas enchaîner "tout simplement" en expliquant que

Mais attention! Tout ce qui fait partie de la bibliothèque standard est placé dans une "boite de rangement" -- que l'on appelle espace de noms (namespace en anglais en C++ -- et qui est désignée par le terme std::

C'est simple, c'est efficace, et ca fournit largement assez d'informations pour permettre d'analyser la suite du code, non ?

On passe à la deuxième ligne:

int main()

On peut enchaîner directement sur

Voici ce que l'on appelle le protoype d'une fonction. Il se compose de trois partie spécifiques qui se suivent dans un ordre bien précis à savoir:

  • le type de la donnée que la fonction renvoie quand elle a fini de s'exécuter
  • le nom de la fonction qui permet d'en provoquer l'exécution et
  • la liste des paramètres (entre parenthèses) dont elle a éventuellement besoin pour travailler

La fonction nommé main est la seule fonction qui soit absolument obligatoire dans un programme, et elle doit respecter le prototype indiqué, car elle sera directement appelée par le système d'exploitation lorsque nous voudrons exécuter le programme

Le terme int est un mot clé (connu du compilateur même si on n'inclut aucun module externe) qui représente une donnée numérique entière

Comme c'est le premier terme qui compose le prototype de la fonction, il indique que la fonction main devra forcément renvoyer une valeur entière à "ce qui l'a appelée".

Après tout, rien ne nous empêche de faire l'impasse sur le prototype plus complet pour l'instant ;)

On peut donc passer à la troisième ligne de code:

{

lorsqu'une accolade ouvrante { suit directement la parenthèse fermante d'un prototype de fonction, cela indique au compilateur que l'on lui fournir le code correspondant aux instructions que la fonction devra effectuer.

On parle généralement de définition de la fonction ou d'implémentation de la fonction (on peut utiliser les deux termes, bien que je préfère le deuxième :D )

De manière générale, l'accolade ouvrante représente le début d'une portée, c'est à dire, d'un groupe d'instructions qui devront être exécutées ensemble et qui ne peut -- a priori -- ne pas être scindé

La notion de portée s'étend jusqu'à ce que le compilateur croise l'accolade fermante qui va de pair avec l'accolade ouvrante en question, même si plusieurs portées peuvent se retrouver "imbriquées" dans une autre portée.

on arrive à la ligne intéressante :D

    std::cout<<"hello world"<<"\n";

Le terme std:: indique formellement au compilateur que la fonctionnalité que l'on s'apprête à utiliser est issu de "la boite de rangement" de laquelle sont issues toutes les fonctionnalités offerte par la bibliothèque standard

le terme cout correspond à cette notion de "sortie standard" que l'on expliquait plus tôt (tu peux broder un peu en cas de besoin, dire que c'est une variable globale, si tu le souhaite ;) ).

le double chevron vers la gauche << est ce que l'on appelle un "opérateur de flux de sortie". Faisons simple, c'est une fonction qui permet d'envoyer différentes information vers la sortie standard (ou vers d'autres flux de sortie)

La phrase "Hello world" correspond à l'information qui sera envoyée vers la sortie standard.

Notez qu'elle est entouré d'une paire de guillemets " pour bien faire comprendre qu'il s'agit d'une chaîne de caractères entière

Le "\n" que j'ai mis à part va provoquer un retour à la ligne (notez que j'aurais pu l'ajouter directement à la phrase "Hello World", cela serait revenu au même)

Le point-virgule qui suit indique au compilateur que l'instruction est terminée.  Chaque fois qu'une instruction (quelle qu'elle soit) est terminée, il faut l'indiquer par un point-virgule

Avant de passer à la ligne suivante

return 0;

va indiquer au compilateur que la fonction est prête à renvoyer la valeur indiquée à  "ce qui a fait appel à la fonction".  Rien de ce qui pourrait suivre cette instruction ne sera exécuté par la fonction (le compilateur émettrait d'ailleurs un avertissement en ce sens).

La valeur 0 renvoyée est spécifique, dans le sens où elle permet au système d'exploitation de savoir que le programme s'est déroulé correctement.  Toute valeur différente de 0 sera interprétée par le système d'exploitation comme le fait "qu'il y a  eu un os" lors de l'exécution du programme.

Bien sur, cette instruction est également suivie par le point-virgule final

Et, enfin, la dernière ligne

}

Je vous ai parlé de l'accolade ouvrante qui représentait le début d'une portée spécifique.  Voici sa soeur jumelle qui représente la fin de la portée en question.

En brodant un peu à gauche et à droite, tu devrais pouvoir répondre à la plupart des questions que tes étudiants voudraient te poser avant même qu'ils n'aie conscience de vouloir le faire, et, surtout, tu devrais pouvoir tenir pas loin de 35 à 40 minutes, ce qui leur laisserait juste assez de temps pour essayer leur premier programme avant la fin du premier cours :D

-
Edité par koala01 17 juin 2019 à 15:40:13

  • Partager sur Facebook
  • Partager sur Twitter
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
17 juin 2019 à 15:45:28

koala01 a écrit:

Donc, en t'assurant qu'ils ont compris cette notion de modularité, tu évites -- a priori -- une grande partie des question concernant la ligne

#include <iostream>

car il "te suffit" alors d'expliquer que c'est le mécanisme qui fourni au compilateur la connaissance d'une partie du module correspondant à la bibliothèque standard qui contient entre autres la notion de sortie standard (commune, en faite) que l'on utilisera plus loin.

Ah, si tu supposes qu'ils ont compris la notion de module ou de bibliothèque avant que tu aies besoin de leur expliquer la notion de fonction, c'est bien parti.

C'est quoi, au fait, ce fameux compilateur ?


> Tout ce qui fait partie de la bibliothèque standard est placé dans une "boite de rangement" -- que l'on appelle espace de noms (namespace en anglais en C++ -- et qui est désignée par le terme std::

Ben là tu as bombardé des termes, sans qu'aucun d'eux ne recouvre une réalité qu'ils puissent intuiter.

Mais si tu as dit ça, tu peux compléter par "et grace à namespace std, on y a accès".

Ou sinon : bon, y a des formalités à mettre au début (include + using), on verra plus tard à quoi ça correspond exactement, et le vif du sujet, pour l'instant c'est ce qu'on met entre les accolades du main.

-
Edité par michelbillaud 17 juin 2019 à 16:08:22

  • Partager sur Facebook
  • Partager sur Twitter